Javascript:从随机集合中排除元素-(好奇)
我有一个关于javascriptJavascript:从随机集合中排除元素-(好奇),javascript,random,Javascript,Random,我有一个关于javascriptMath.random()的问题: 我必须(对于我正在构建的游戏)随机生成给定集合中的每个数字(即从0到1000),每次我必须生成一个数字时,我必须检查该数字是否已经“生成” 考虑一个简单的算法来检查生成的集合中是否已经存在随机整数,这个解决方案非常简单。它循环生成数字,直到找不到为止。 下面是一个片段: /* ... */ for(var i = 0; i<upperBound; i++){ var randN = Math.floor(Math.
Math.random()
的问题:
我必须(对于我正在构建的游戏)随机生成给定集合中的每个数字(即从0到1000),每次我必须生成一个数字时,我必须检查该数字是否已经“生成”
考虑一个简单的算法来检查生成的集合中是否已经存在随机整数,这个解决方案非常简单。它循环生成数字,直到找不到为止。
下面是一个片段:
/* ... */
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);
}
/* ... */
/**/
对于(var i=0;i,如果您的数字范围不是太大,您可以简单地生成一个包含所有数字的列表,将其随机化,然后逐个选择
下面是对示例实现的一个快速修改,以显示此方法的实际效果:如果您的数字范围不是太大,您可以简单地生成一个包含所有数字的列表,将其随机排列,然后逐个选择
下面是对示例实现的快速修改,以展示此方法的实际应用:一个布尔1001大数组怎么样
如果要检查已生成的编号,只需检查数组中该位置的编号:
if (!arr[randomnumber]){
arr[randomnumber] = true;
}
最后,您可以扫描阵列以找到所需的数字
这增加了对数字进行排序的副作用,因为扫描会按顺序将其挑选出来
我的一篇博文的主题与此类似:
一组1001大的布尔数怎么样
如果要检查已生成的编号,只需检查数组中该位置的编号:
if (!arr[randomnumber]){
arr[randomnumber] = true;
}
最后,您可以扫描阵列以找到所需的数字
这增加了对数字进行排序的副作用,因为扫描会按顺序将其挑选出来
我的一篇博文的主题与此类似:
按顺序生成一组数字
对列表进行随机排序
下面是一个使用的示例:
for(var nums=[],i=0;i
按顺序生成一组数字
对列表进行随机排序
下面是一个使用的示例:
for(var nums=[],i=0;i我将创建一个数组并随机洗牌它:
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);
我会创建一个数组并随机洗牌:
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);
最好的方法可能是生成一个数字数组,然后使用
以下是维基百科文章中给出的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”,其中包含要洗牌的项目。)最好的方法可能是生成一个数字数组,然后使用
以下是维基百科文章中给出的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”,其中包含要洗牌的项。)可能会有帮助。或者。@patrick dw:这是我的相同解决方案,递归;)是的,我读得太快了。可能会有帮助。或者。@patrick dw:这是我的相同解决方案,递归;)是的,我读得太快了。正如答案中所指出的,这不会给出一个非常随机的分布,并且在不同的浏览器中会有不同的偏差。Fisher-Yates shuffle没有那么多代码,而且会做得更好。请参阅shuffle()
函数在我链接到的文件中,用于实现Fisher-Yates。如回答中所述,这不会给出非常随机的分布,并且在不同的浏览器中会有不同的偏差。Fisher-Yates shuffle没有那么多的代码,而且会做得更好。请参阅shuffle()
我链接到的文件中的函数,用于实现Fisher-Yates。