2

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

更新:您将如何确保不创建重复项?

4

5 回答 5

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并且由于某种原因会生成大量重复项,则此代码可能需要很长时间才能完成。尽管当您谈论大量唯一随机数时,我认为没有任何方法可以解决这种潜在问题。

于 2012-04-06T11:59:27.067 回答
2

是的,这是可能的。

  1. 用于Math.random生成伪随机数。Math.random返回一个大于或等于0且小于的伪随机数1,因此要获得一个 10 位数字(我假设是一个整数),您可以将其乘以 1,000,000,000 并用Math.roundor将其四舍五入Math.floor。(如果您需要它们全部为 10 位数,请进行相应调整 - 添加一个基本金额,乘以一个更高的数字等)

  2. 使用一个对象来跟踪它们,所以var obj = {};开始吧。

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

  4. 测试对象是否有生成的数字使用if (obj[number])

  5. 循环直到你有正确数量的唯一数字。

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

请注意,为此使用“数组”是不必要的;JavaScript 数组并不是真正的数组,它们只是具有一些特殊功能的对象。

于 2012-04-06T11:35:45.567 回答
1

You could do this in JS, but you would have to check the array to see if it contains the currently generated random number. This would obviously degrade performance.

See if these answers help.

Random number generator that fills an interval

Generate unique random numbers between 1 and 100

于 2012-04-06T11:36:52.107 回答
1

生成 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);
}

它必须返回一个字符串,因为转换为数字会弄乱结果。哦,所有的数字都是整数。

于 2012-04-06T12:52:31.790 回答
-2

为什么不?这是代码:

var a=[]; 
for (var i=1000; i--;) 
 a.push(Math.random()*10000000000)
于 2012-04-06T11:36:32.820 回答