我对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);
}
/* ... */
我想知道:这是实现这一目标的最佳方法吗?或者有什么方法,而不是循环,直到它产生一个&#34;好&#34; number,以排除随机生成中的特定集合?
非常感谢大家!
答案 0 :(得分: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',其中包含您想要随机播放的项目。)