在循环中使用javascript生成1000个随机10位数字

时间:2012-04-06 11:31:27

标签: javascript loops random

我想使用10位数生成至少1000个唯一随机数 循环中的JavaScript。这可能吗?或者Javascript是错误的做法吗?

更新:您如何确定不会创建重复项?

5 个答案:

答案 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)

是的,这是可能的。

  1. 使用Math.random生成伪随机数。 Math.random返回一个大于或等于0且小于1的伪随机数,因此要得到一个10位数字(我假设整数),你' d将其乘以1,000,000,000并将其与Math.roundMath.floor进行对比。 (如果您需要所有为10位数,请相应调整 - 添加基数,乘以更高的数字等)。

  2. 使用对象来跟踪它们,因此var obj = {};开始。

  3. 将数字存储为对象中的键,例如obj[number] = true

  4. 使用if (obj[number])

  5. 测试对象是否具有生成的数字
  6. 循环,直到您拥有正确数量的唯一数字。

  7. 我使用对象存储数字的原因是JavaScript对象本质上是映射,并且引擎被优化以快速从对象中检索属性。在幕后,一个实现可以做它喜欢的,但可能会使用哈希表或类似的。

    请注意,使用“数组”是不必要的; JavaScript arrays aren't really arrays,它们只是具有几个特殊功能的对象。

答案 2 :(得分:1)

您可以在JS中执行此操作,但您必须检查数组以查看它是否包含当前生成的随机数。这显然会降低性能。

看看这些答案是否有帮助。

Random number generator that fills an interval

Generate unique random numbers between 1 and 100

答案 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)