JavaScript,生成长度为9个数字的随机数

AnA*_*ice 44 javascript

我正在寻找一种有效,优雅的方法来生成长度为9位的JavaScript变量:

示例:323760488

myk*_*hal 57

为什么不从Math.random()字符串表示中提取数字?

Math.random().toString().slice(2,11);
/*
Math.random()                         ->  0.12345678901234
             .toString()              -> "0.12345678901234"
                        .slice(2,11)  ->   "123456789"
 */
Run Code Online (Sandbox Code Playgroud)

(要求是每个javascript实现Math.random()的精度至少为9位小数)

  • 而这些都是零填充的甜蜜 (2认同)
  • 这个答案比其他答案好光年。 (2认同)
  • 难道这仍然可能返回一个以 0 开头的数字(如果随机数 < 0.1) (2认同)
  • @Ryan 完全正确。如果`Math.random()` 返回的数字是`0.0123456789123`,那么结果将是`012345678`,作为一个int,即`12345678`,它只有8 位数字。 (2认同)

小智 52

您可以生成9个随机数字并将它们连接在一起.

或者,您可以调用random()并将结果乘以1000000000:

Math.floor(Math.random() * 1000000000);
Run Code Online (Sandbox Code Playgroud)

由于Math.random()生成0到1之间的随机双精度数,因此您将拥有足够的精度数字,以便在最不重要的位置具有随机性.

如果您想确保您的号码以非零数字开头,请尝试:

Math.floor(100000000 + Math.random() * 900000000);
Run Code Online (Sandbox Code Playgroud)

或者用零填充:

function LeftPadWithZeros(number, length)
{
    var str = '' + number;
    while (str.length < length) {
        str = '0' + str;
    }

    return str;
}
Run Code Online (Sandbox Code Playgroud)

或使用此内联"技巧"填充.


小智 20

也...

function getRandom(length) {

return Math.floor(Math.pow(10, length-1) + Math.random() * 9 * Math.pow(10, length-1));

}
Run Code Online (Sandbox Code Playgroud)

getRandom(9)=> 234664534


Joh*_*ung 8

我发现效率的三种方法:(运行Firefox 7.0 Win XP的测试机)

parseInt(Math.random()*1000000000, 10)
Run Code Online (Sandbox Code Playgroud)

100万次迭代:~626ms.到目前为止最快 - parseInt是一个本机函数vs再次调用Math库.注意:见下文.

Math.floor(Math.random()*1000000000)
Run Code Online (Sandbox Code Playgroud)

100万次迭代:~1005ms.两个函数调用.

String(Math.random()).substring(2,11)
Run Code Online (Sandbox Code Playgroud)

100万次迭代:~2997ms.三个函数调用.

并且...

parseInt(Math.random()*1000000000)
Run Code Online (Sandbox Code Playgroud)

100万次迭代:~362ms.注意:parseInt通常被认为是不安全的,没有radix参数.请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt或google"JavaScript:The Good Parts".但是,传递给parseInt的参数似乎永远不会以'0'或'0x'开头,因为输入首先乘以1000000000.YMMV.


nvi*_*rna 6

Math.random().toFixed(length).split('.')[1]
Run Code Online (Sandbox Code Playgroud)

使用 toFixed 允许您设置比默认值更长的长度(似乎在小数点后生成 15-16 位数字。如果需要,ToFixed 将让您获得更多数字。


ces*_*pon 5

在一行中:

var len = 10;
parseInt((Math.random() * 9 + 1) * Math.pow(10,len-1), 10);
Run Code Online (Sandbox Code Playgroud)

脚步:

  • 我们生成一个满足的随机数1 ? x < 10
  • 然后,我们乘以Math.pow(10,len-1)(长度为的数字len)。
  • 最后,parseInt()删除小数。