3

当我在循环中调用此语句 4 次时,它给了我重复的随机数。

var a = (parseInt(Math.random() * 4))+1

例如,有时它给我 1,3,2,4(很好!!),但有时它会产生 1,3,1,4 等。

我如何确保当我的循环运行 4 次时,我每次都得到唯一的设置

4

6 回答 6

4

改组一个预先填充的数组将是一个很好的解决方案:

→ jsBin.com

// shuffle function taken from here
// http://stackoverflow.com/a/2450976/603003
alert( shuffle( [1,2,3,4] ) );

另一种方法包括以下功能:

→ jsFiddle

function gen4Numbers() {
    var numbers = [];
    while (numbers.length < 4) {
        var newNr = (parseInt(Math.random() * 4))+1;
        if (numbers.indexOf(newNr) == -1) {
            numbers.push(newNr);
        }
    }
    return numbers;
}
alert(gen4Numbers());

应该警告您,此代码很可能会永远循环。

于 2013-10-19T13:30:53.833 回答
4

您需要缓冲您的答案,但更好的方法是预先计算它们。

因此,例如,您想要从 1 到 4 且唯一的随机整数,这与随机排序从 1 到 4 的值数组相同

对于一般情况:

// numbers of values
var n = 10;

// make initially sorted array
var arr = [];
for (var i=1; i<=n; ++i) { arr.push(i); }

// randomly sort the array
arr.sort(function () { return Math.random() - 0.5; });

现在 arr 将以随机顺序包含从 1 到 10 的所有数字,因此如果您想要该范围内的 4 个唯一随机数,它们位于 arr[0]、arr[1]、arr[2]、arr[3]

制作n = 4,你的问题就解决了

于 2013-10-19T13:34:22.367 回答
2

我在利用时间

var d = new Date(); 
var uniqId = d.getTime();
于 2013-10-19T13:29:23.687 回答
1

将数字存储在一个数组中,并且每次检查该数字是否是之前生成的。

如果您没有生成很多数字,那么这非常快,因为您不必

循环很多。

============= 编辑1 ==============

但是,如果您必须生成大量随机数,我建议放置一个数组

所有的数字,洗牌,然后取你需要的前 n 个数字。

数组改组可以在这里找到:

http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
于 2013-10-19T13:26:05.587 回答
0

如果您需要大量数字,您应该存储每个不同的数字,然后在循环的每次迭代中选取一个。

var maxnB = 1000; // or 4
var list = [];

for (var i = 1; i <= maxNb; ++i) // store all number in a list [1, 2, 3, ... , maxNb]
   list.push(i);

while (list.length > 0)
{
   var pos = (parseInt(Math.random() * list.length))

   var myNumber = list[pos];  // get your unique random number
   list[pos] = list[list.length - 1]; // replace the number used with last number 
   list.pop(); //remove last number, decrease list.length by 1

   // do something with your new number
}

这样做,您永远循环的概率为 0,并且如果pop()方法和[]运算符具有 ao(1) 时间复杂度访问,它将改善时间处理,而不是每次获得新的时都在缓冲区列表中查找您的号码要检查的号码。

于 2013-10-19T13:46:39.143 回答
0

做这个。

for( i = 0; i< 4; i++)
{
  num = Math.floor((Math.random() * 3) + 1);

  if(randomArray.indexOf(num)<0)
  {
    randomArray[i]=num;
  }//endif
  else
  {
    i=i-1;
  }//endElse
}//endForLoop

基本上,如果一个数字重复 - 让我们说在位置 3(randomArray[3] 与 randomArray[atAnotherIndex] 具有相同的值,您的计数器会回到 3 并再次执行 math.random 直到获得唯一值。

于 2015-05-13T03:00:34.833 回答