在JavaScript中生成精确的随机数

在JavaScript中生成精确的随机数,javascript,math,random,Javascript,Math,Random,我有这个函数: Number.random = function(minimum, maximum, precision) { minimum = minimum === undefined ? 0 : minimum; maximum = maximum === undefined ? 9007199254740992 : maximum; precision = precision === undefined ? 0 : precision; var ran

我有这个函数:

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

    return random;
}
现在精度还没有实现,有人对我如何实现它有什么好的想法吗?精度选项的目的是为您提供固定数量的多个小数点,例如:

// A number from 0 to 10 that will always come back with two decimal places
Number.random(0, 10, 2); // 3.14

您可以尝试将数字乘以
10^精度
,四舍五入,然后除以
10^精度
。这会给你想要的结果。下面是这个逻辑的粗略实现。不过,您可能希望在precision参数上添加一些错误检查,或者使用其他方法进行计算(例如
Math.pow

Number.random=函数(最小值、最大值、精度){
最小值=最小值===未定义?0:最小值;
最大值=最大值===未定义?9007199254740992:最大值;
精度=精度===未定义?0:精度;
var random=数学地板(数学随机()*(最大值-最小值+1))+最小值;
对于(变量i=0;i
试试这个:

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.random() * (maximum - minimum) + minimum;

    return random.toFixed(precision);
}
Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.random() * (maximum - minimum + 1) + minimum;

    return Math.round(random * Math.pow(10, precision)) / Math.pow(10, precision);
}
它使用函数设置精度

演示:

试试这个:

Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.random() * (maximum - minimum) + minimum;

    return random.toFixed(precision);
}
Number.random = function(minimum, maximum, precision) {
    minimum = minimum === undefined ? 0 : minimum;
    maximum = maximum === undefined ? 9007199254740992 : maximum;
    precision = precision === undefined ? 0 : precision;

    var random = Math.random() * (maximum - minimum + 1) + minimum;

    return Math.round(random * Math.pow(10, precision)) / Math.pow(10, precision);
}

由于您尚未定义任何限制w.r.t.您可能需要的
精度
,并且记住Javascript中
数字
的限制(精确的数字表示),因此您可能会发现
字符串
表示是可以接受的。在这种情况下,你可能想做这样的事情

Javascript

var maxInteger = 9007199254740992;

function randomInteger(minimum, maximum) {
    return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
}

Number.random = function (minimum, maximum, precision) {
    minimum = typeof minimum !== 'number' ? 0 : minimum;
    minimum = minimum < -maxInteger ? -maxInteger : minimum;
    maximum = typeof maximum !== 'number' || maximum > maxInteger ? maxInteger : maximum;
    precision = typeof precision !== 'number' || precision < 0 ? 0 : precision;

    var random = randomInteger(minimum, maximum).toString(),
        decimals;

    if (precision) {
        decimals = '';
        while (decimals.length < precision) {
            decimals += randomInteger(0, maxInteger)
        }

        random += '.' + decimals.slice(0, precision);
    }

    return random;
}

console.log(Number.random(-maxInteger, maxInteger, 40));
var maxInteger=9007199254740992;
函数随机整数(最小值、最大值){
返回Math.floor(Math.random()*(最大值-最小值+1))+最小值;
}
Number.random=函数(最小值、最大值、精度){
最小值=最小值的类型!='number'?0:最小值;
最小值=最小值<-maxInteger?-maxInteger:最小值;
最大值=最大值的类型!='number'| | max>maxInteger?maxInteger:最大值;
精度=精度类型!=“数字”|精度<0?0:精度;
var random=randomInteger(最小值、最大值).toString(),
小数;
if(精度){
小数=“”;
while(小数长度<精度){
小数+=随机整数(0,maxInteger)
}
随机+='..+小数切片(0,精度);
}
返回随机;
}
log(Number.random(-maxInteger,maxInteger,40));

上,使用您正在生成的范围,则结果必须是一个
字符串
,如果它是可表示的。或者,如果要将退货表示为数字,则需要更改范围。范围是否太大?不必转换成字符串,我能做的最大值是什么?我相信它是17个有效数字。我得再检查一遍。所以我想这取决于你想要什么作为
精度
数学的值。floor
会杀死小数,不是吗?谢谢@YuriyGalanter我删除了
floor
函数我想这可能行得通:返回数字(random.toFixed(precision));或者
返回parseFloat(random.toFixed(precision))
谢谢@reaxisAnd,如果您尝试类似于
console.log(Number.random(未定义,未定义,3))
而不是
console.log(Number.random(3,5,3))