我想使用10位数生成至少1000个唯一随机数 循环中的JavaScript。这可能吗?或者Javascript是错误的做法吗?
更新:您如何确定不会创建重复项?
答案 0 :(得分:3)
我将如何做到这一点:
var arr = [],
track = [],
min = 1000000000,
max = 9999999999,
qty = 1000,
ii = 0,
rnd;
while (ii < qty) {
rnd = Math.floor(Math.random() * (max - min + 1)) + min;
if (!track[rnd]) {
arr[ii] = track[rnd] = rnd;
ii += 1;
}
}
以下是一个有效的例子:http://jsfiddle.net/mTmEs/
现在,如果Math.random
出现问题,并且由于某种原因导致产生大量重复,则此代码可能需要很长时间才能完成。当你谈论大量独特的随机数时,我认为没有办法绕过这种潜在的问题。
答案 1 :(得分:2)
是的,这是可能的。
使用Math.random
生成伪随机数。 Math.random
返回一个大于或等于0
且小于1
的伪随机数,因此要得到一个10位数字(我假设整数),你' d将其乘以1,000,000,000并将其与Math.round
或Math.floor
进行对比。 (如果您需要所有为10位数,请相应调整 - 添加基数,乘以更高的数字等)。
使用对象来跟踪它们,因此var obj = {};
开始。
将数字存储为对象中的键,例如obj[number] = true
。
使用if (obj[number])
循环,直到您拥有正确数量的唯一数字。
我使用对象存储数字的原因是JavaScript对象本质上是映射,并且引擎被优化以快速从对象中检索属性。在幕后,一个实现可以做它喜欢的,但可能会使用哈希表或类似的。
请注意,使用“数组”是不必要的; JavaScript arrays aren't really arrays,它们只是具有几个特殊功能的对象。
答案 2 :(得分:1)
您可以在JS中执行此操作,但您必须检查数组以查看它是否包含当前生成的随机数。这显然会降低性能。
看看这些答案是否有帮助。
答案 3 :(得分:1)
用于生成长度为l的n个随机数的通用函数可能是:
// Generate n unique random numbers of length l
// l should be less than 15
function genNRandLen(n, l) {
// Make sure l and n are numbers
n = Number(n);
l = Number(l);
// Protect against bad input
if (isNaN(l) || isNaN(n)) return;
var o = {}, a = [], num;
var min = l == 1? 0 : Math.pow(10, l-1);
var r = Math.pow(10, l) - min;
// Protect against endless loop
if (n >= (r)) return;
while (n--) {
do {
num = Math.floor(min + (Math.random()*r));
} while (o[num])
o[num] = true;
a[n] = num;
}
return a.sort();
}
排序只是为了在测试时轻松查看重复项,如果不需要则删除或首选随机顺序。
如果需要超过15位的数字,可以通过连接较短随机数字符串并修剪到所需长度来创建它们。以下将生成任意长度的随机数:
// Generate random number of length l
function randLen(l) {
var n = '';
while (n.length < l) {
n += String(Math.random()).replace(/^0\.0*/,'');
}
return n.substring(0, l);
}
它必须返回一个字符串,因为转换为数字会弄乱结果。哦,所有数字都是整数。
答案 4 :(得分:-2)
为什么不呢?这是代码:
var a=[];
for (var i=1000; i--;)
a.push(Math.random()*10000000000)