我有:
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];
}
答案 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()})
应该为你做的伎俩,而不必担心每个随机数是否都是唯一的。
没有循环,非常简单。