Javascript:从随机集中排除元素 - (好奇心)

时间:2011-01-14 15:13:07

标签: javascript random

我对javascript Math.random()

有疑问

我(对于我建造的游戏)随机生成给定集合中的每个数字(即从0到1000),每次我必须生成一个数字时,我必须检查该数字是否有已经生成了#34;。

解决方案非常容易考虑一种简单的算法,该算法检查随机整数是否已经存在于生成的集合中。它会循环生成数字,直到无法找到它。 下面的代码段:

/* ... */
for(var i = 0; i<upperBound; i++){
    var randN = Math.floor(Math.random()*upperBound);
    while(myRandomNumbers.contains(randN)){
        loops++;
        randN = Math.floor(Math.random()*upperBound);
    }
    myRandomNumbers.push(randN);
}
/* ... */

running example here

我想知道:这是实现这一目标的最佳方法吗?或者有什么方法,而不是循环,直到它产生一个&#34;好&#34; number,以排除随机生成中的特定集合?

非常感谢大家!

5 个答案:

答案 0 :(得分:3)

  1. 按顺序生成一组数字。
  2. 随机排序列表。
  3. 以下是使用naive, biased sort

    的示例
    for (var nums=[],i=0;i<1000;++i) nums[i]=i+1;
    nums.sort(function(){ return Math.random()-0.5 });
    

    然后你可以pop() nums个号码来获取下一个'随机'号码,保证以前从未使用过。

答案 1 :(得分:1)

如果你的数字范围不是太大,你可以简单地生成一个包含所有数字的列表,随机化它,然后一个接一个地将它取出。

以下是您的示例实施的快速入门,以展示此方法:http://www.jsfiddle.net/ZTLt9/8/

答案 2 :(得分:1)

我会创建一个数组并随机随机播放它:

function shuffle(arr) {
    var shuffled = arr.slice(0), i = arr.length, temp, index;
    while (i--) {
        index = Math.floor(i * Math.random());
        temp = shuffled[index];
        shuffled[index] = shuffled[i];
        shuffled[i] = temp;
    }
    return shuffled;
}

// Create the array
var i = 1000, arr = [];
while (i--) arr[i] = i;

// Shuffle it
arr = shuffle(arr);

答案 3 :(得分:0)

一大群布尔1001怎么样。

如果要检查已生成的数字,您需要做的就是检查数组中该位置的数字:

if (!arr[randomnumber]){
    arr[randomnumber] = true;
}

最后,您可以扫描阵列以找到所需的数字。

这会增加对数字进行排序的副作用,因为扫描会按顺序将它们选出。

类似的内容是我的一篇博文的主题: http://www.jameswiseman.com/blog/2010/05/27/generate-and-sort-lottery-numbers/

答案 4 :(得分:0)

最好的方法可能是生成一组数字,然后使用Fisher-Yates shuffle对其进行随机播放。

以下是维基百科文章中给出的JavaScript示例:

var n = a.length;
for(var i = n - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

(这假设您有一个数组'a',其中包含您想要随机播放的项目。)