如何从JavaScript中的Math.random获取唯一数字?

时间:2013-10-19 13:17:07

标签: javascript

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

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

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

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

6 个答案:

答案 0 :(得分:4)

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

→ jsBin.com

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

另一个apporach包含以下功能:

→ 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());

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

答案 1 :(得分: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并解决问题

答案 2 :(得分:2)

我正在使用时间

var d = new Date(); 
var uniqId = d.getTime();

答案 3 :(得分:1)

将数字存储在一个数组中,每次都检查之前是否生成了数字。

如果你没有产生很多数字,这是非常快的,因为你没有

循环很多。

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

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

数组

所有数字,拖曳它,然后取你需要的前n个数字。

阵列改组可以在这里找到:

http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array

答案 4 :(得分: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
}

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

答案 5 :(得分: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,直到达到唯一值。 / p>