【发布时间】:2012-04-20 00:48:32
【问题描述】:
我想使用 10 位生成至少 1000 个唯一随机数 循环中的javascript。这可能吗?或者 Javascript 是错误的做法吗?
更新:您将如何确保不会创建重复项?
【问题讨论】:
-
是的,这在 JavaScript 中是可能的。
-
是的,这是可能的。你想要提示吗?
标签: javascript loops random
我想使用 10 位生成至少 1000 个唯一随机数 循环中的javascript。这可能吗?或者 Javascript 是错误的做法吗?
更新:您将如何确保不会创建重复项?
【问题讨论】:
标签: javascript loops random
我会这样做:
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 出现问题并且由于某种原因会生成大量重复项,则此代码可能需要很长时间才能完成。不过,当您谈论大量唯一随机数时,我认为没有任何办法可以解决这种潜在问题。
【讨论】:
是的,这是可能的。
使用Math.random 生成伪随机数。 Math.random 返回一个大于或等于 0 且小于 1 的伪随机数,因此要获得一个 10 位数字(我假设是一个整数),您可以将其乘以 1,000,000,000 和用Math.round 或Math.floor 将其四舍五入。 (如果您需要它们全部为 10 位数,请进行相应调整 - 添加一个基本金额,乘以一个更高的数字等)
使用对象来跟踪它们,所以从var obj = {};开始。
将数字作为键存储在对象中,例如obj[number] = true。
使用if (obj[number])测试对象是否有生成的数字
循环直到获得正确数量的唯一编号。
我使用对象来存储数字的原因是 JavaScript 对象本质上是映射,并且引擎经过优化可以快速从对象中检索属性。在幕后,一个实现可以做它喜欢做的事,但可能会使用哈希表或类似的东西。
请注意,没有必要为此使用“数组”; JavaScript arrays aren't really arrays,它们只是具有几个特殊功能的对象。
【讨论】:
您可以在 JS 中执行此操作,但您必须检查数组以查看它是否包含当前生成的随机数。这显然会降低性能。
看看这些答案是否有帮助。
【讨论】:
生成 n 个长度为 l 的随机数的通用函数可能是:
// 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);
}
它必须返回一个字符串,因为转换为数字会弄乱结果。哦,所有的数字都是整数。
【讨论】:
为什么不呢?代码如下:
var a=[];
for (var i=1000; i--;)
a.push(Math.random()*10000000000)
【讨论】: