随机数是随机的。不能保证您不会两次获得相同的随机数。事实上,当您将随机数转换为有限范围的整数时,您很可能会两次获得相同的数字。
您可以通过复制数组来解决此问题,然后每次从数组中获取值时,将其删除。让我们将生成随机索引的代码分解为一个单独的函数;在其他情况下也很方便:
// Return a random integer >= 0 and < n
function randomInt( n ) {
return Math.floor( Math.random() * n );
}
var copy = elements.slice();
while( copy.length ) {
var index = randomInt( copy.length );
this.animateSymbol( copy[index] );
copy.splice( index, 1 );
}
只是为了好玩,这里有另一种可以编写循环的方法:
var copy = elements.slice();
while( copy.length ) {
var index = randomInt( copy.length );
this.animateSymbol( copy.splice( index, 1 )[0] );
}
任何一个都做同样的事情。为了清楚起见,我有点喜欢逐步的方法,但是该.splice()
方法返回您删除的元素的数组可能非常方便。
这是您可以粘贴到 JavaScript 控制台进行测试的代码版本:
// Return a random integer >= 0 and < n
function randomInt( n ) {
return Math.floor( Math.random() * n );
}
var elements = [ 'a', 'b', 'c', 'd', 'e' ];
var copy = elements.slice();
while( copy.length ) {
var index = randomInt( copy.length );
console.log( copy.splice( index, 1 )[0] );
}
console.log( 'Done' );
Xotic750 的回答也值得一看。它使用 Fisher-Yates shuffle 将数组随机化。对于非常长的数组,这可能会更有效。