我正在寻找一种高效,优雅的方式来生成长度为9位的JavaScript变量:
示例:323760488
答案 0 :(得分:54)
为什么不从Math.random()
字符串表示中提取数字?
Math.random().toString().slice(2,11);
/*
Math.random() -> 0.12345678901234
.toString() -> "0.12345678901234"
.slice(2,11) -> "123456789"
*/
(要求是每个javascript实现Math.random()
的精度至少为9位小数)
答案 1 :(得分:47)
您可以生成9个随机数字并将它们连接在一起。
或者,您可以调用random()
并将结果乘以1000000000:
Math.floor(Math.random() * 1000000000);
由于Math.random()
生成一个介于0和1之间的随机双精度数,因此您将拥有足够的精度数位,以便在最不重要的位置保持随机性。
如果您想确保您的号码以非零数字开头,请尝试:
Math.floor(100000000 + Math.random() * 900000000);
或用零填充:
function LeftPadWithZeros(number, length)
{
var str = '' + number;
while (str.length < length) {
str = '0' + str;
}
return str;
}
或使用 inline 'trick' 填充。
答案 2 :(得分:19)
也...
function getRandom(length) {
return Math.floor(Math.pow(10, length-1) + Math.random() * 9 * Math.pow(10, length-1));
}
getRandom(9)=&gt; 234664534
答案 3 :(得分:8)
我发现效率的三种方法: (运行Firefox 7.0 Win XP的测试机)
parseInt(Math.random()*1000000000, 10)
100万次迭代:~626ms。到目前为止最快 - parseInt是一个本机函数vs再次调用Math库。注意:见下文。
Math.floor(Math.random()*1000000000)
100万次迭代:~1005ms。两个函数调用。
String(Math.random()).substring(2,11)
100万次迭代:~2997ms。三个函数调用。
还有......
parseInt(Math.random()*1000000000)
100万次迭代:~362ms。 注意:parseInt通常被认为是不安全的,没有radix参数。请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt或谷歌“JavaScript:好的部分”。但是,传递给parseInt的参数似乎永远不会以'0'或'0x'开头,因为输入首先乘以1000000000.YMMV。
答案 4 :(得分:5)
在一行(ish)中:
var len = 10;
parseInt((Math.random() * 9 + 1) * Math.pow(10,len-1), 10);
<强>步骤:强>
1 ≤ x < 10
的随机数。Math.pow(10,len-1)
(长度为len
的数字)。parseInt()
删除小数。答案 5 :(得分:2)
屏幕抓取此页:
答案 6 :(得分:2)
以为我会抓住你的问题。当我运行以下代码时,它对我有用。
GET /companies
答案 7 :(得分:2)
Math.random().toFixed(length).split('.')[1]
使用“固定”可让您将长度设置为比默认值长(似乎会在小数点后生成15-16位数字。“固定”将使您需要的位数更多。
答案 8 :(得分:1)
function rand(len){var x='';
for(var i=0;i<len;i++){x+=Math.floor(Math.random() * 10);}
return x;
}
rand(9);
答案 9 :(得分:0)
Math.floor(Math.random()* 899999999 + 100000000);
答案 10 :(得分:0)
如果您要生成随机电话号码,则通常禁止从零开始。 这就是你应该结合几种方法的原因:
Math.floor(Math.random()*8+1)+Math.random().toString().slice(2,10);
这将产生100 000 000至999 999 999之间的随机
使用其他方法我有点麻烦来获得可靠的结果,因为领先的零点在某种程度上是一个问题。
答案 11 :(得分:0)
我知道答案很旧,但是我想分享这种方式来生成整数或从0到n的浮点数。请注意,点的位置(浮动情况)在边界之间是随机的。该数字是一个字符串,因为MAX_SAFE_INTEGER的限制现在为9007199254740991
Math.hRandom = function(positions, float = false) {
var number = "";
var point = -1;
if (float) point = Math.floor(Math.random() * positions) + 1;
for (let i = 0; i < positions; i++) {
if (i == point) number += ".";
number += Math.floor(Math.random() * 10);
}
return number;
}
//integer random number 9 numbers
console.log(Math.hRandom(9));
//float random number from 0 to 9e1000 with 1000 numbers.
console.log(Math.hRandom(1000, true));
答案 12 :(得分:0)
function randomCod(){
let code = "";
let chars = 'abcdefghijlmnopqrstuvxwz';
let numbers = '0123456789';
let specialCaracter = '/{}$%&@*/()!-=?<>';
for(let i = 4; i > 1; i--){
let random = Math.floor(Math.random() * 99999).toString();
code += specialCaracter[random.substring(i, i-1)] + ((parseInt(random.substring(i, i-1)) % 2 == 0) ? (chars[random.substring(i, i-1)].toUpperCase()) : (chars[random.substring(i, i+1)])) + (numbers[random.substring(i, i-1)]);
}
code = (code.indexOf("undefined") > -1 || code.indexOf("NaN") > -1) ? randomCod() : code;
return code;
}
答案 13 :(得分:0)
这已经有足够的答案了吗?
我猜不是。因此,即使Math.random()
决定返回类似0.000235436
的数字,这也应该可靠地提供9位数字:
Math.floor((Math.random() + Math.floor(Math.random()*9)+1) * Math.pow(10, 8))
答案 14 :(得分:0)
max
独占:Math.floor(Math.random() * max);
包含max
和Math.round(Math.random() * max);
答案 15 :(得分:0)
为了生成长度为 n 的数字字符串,感谢@nvitaterna,我想出了这个:
1 + Math.floor(Math.random() * 9) + Math.random().toFixed(n - 1).split('.')[1]
它防止第一个数字为零。 每次调用它可以生成长度~50的字符串。