如何在javascript中为该范围内的每个数字获取特定范围内的唯一随机整数?

时间:2011-07-02 13:53:17

标签: javascript random

我有:

function getRandomInt(min, max){
        return Math.floor(Math.random() * (max - min + 1)) + min;
}

但问题是我想随机化一个数组中元素的数量(因此它们每次在我填充的东西中都不会以相同的顺序出现)所以我需要确保返回的数字是唯一的到目前为止的其他数字。

所以而不是:

   for(var i = 0; i < myArray.length; i++) {

   }

我有:

var i;
var count = 0;
while(count < myArray.length){
  count++;
  i = getRandomInt(0, myArray.length); // TODO ensure value is unique

  // do stuff with myArray[i];
}

4 个答案:

答案 0 :(得分:3)

看起来而不是独立的均匀随机数,你宁愿想要集合{1,2,3,...,N}的随机置换。我认为有一个shuffle方法可以为你做这个。


根据要求,这是代码示例:

function shuffle(array) {
  var top = array.length;
  while (top--) {
      var current = Math.floor(Math.random() * top);
      var tmp = array[current];
      array[current] = array[top - 1];
      array[top - 1] = tmp;
    }
  return array;
}

答案 1 :(得分:2)

有时候随机化某些东西(比如纸牌)的最佳方法是在拉出它之前不要将其洗牌,而是在拉出它时将其洗牌。

说你有:

var i,
    endNum = 51,
    array = new Array(52);
for(i = 0; i <= endNum; i++) {
    array[i] = i;
}

然后你可以写一个这样的函数:

function drawNumber() {
    // set index to draw from
    var swap,
        drawIndex = Math.floor(Math.random() * (endNum+ 1));

    // swap the values at the drawn index and at the "end" of the deck
    swap = array[drawIndex];
    array[drawIndex] = array[endNum];
    array[endNum] = swap;

    endNum--;
}

由于我减少了结束计数器,所以绘制的项目将在堆栈末尾被“丢弃”,随机化函数只会将0中的项目视为可行。

这是我使用过的一种常见模式,我可能已将其用于js不正确,因为我上次使用它是用于在c#中编写一个简单的纸牌游戏。事实上,我只是看着它而我int ____而不是var ____ lol

答案 2 :(得分:2)

如果我理解得很好,你需要一个整数数组,但是要随机排序。

描述here

的方法

首先创建一个rand函数:

function randOrd(){
return (Math.round(Math.random())-0.5); }

然后,随机化你的数组。以下示例说明了如何:

anyArray = new Array('1','2','3','4','5');
anyArray.sort( randOrd );
document.write('Random : ' + anyArray + '<br />';);

希望这会有所帮助,

此致

最高

答案 3 :(得分:1)

您可以将函数传递给Array.Sort方法。如果此函数返回一个随机高于或低于零的值,那么您的数组将被随机排序。

myarray.sort(function() {return 0.5 - Math.random()})

应该为你做的伎俩,而不必担心每个随机数是否都是唯一的。

没有循环,非常简单。