请引用下面的代码。
for (var i = 0; i < elements.length; i++)
{
//var element = elements[Math.floor(Math.random()*elements.length)];
this.animateSymbol(elements[Math.floor(Math.random()*elements.length)]);
}
elements 数组包含 svg 元素列表(圆/路径/椭圆等)。我想从元素数组中选择随机元素。
在某些情况下,它会返回相同的元素,我想随机选择该元素,无需再次选择相同的元素。需要从该数组中选择不同的元素。
有什么问题吗?为什么它返回相同的索引和相同的元素?
谢谢
湿婆
最佳答案
随机数是随机的。无法保证您不会两次获得相同的随机数。事实上,当您将随机数转换为有限范围的整数时,很可能您会得到相同的数字两次。
您可以通过复制数组来解决此问题,然后每次从数组中获取值时,将其删除。我们还将生成随机索引的代码分解为单独的函数;它在其他情况下也很方便:
// 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's answer 。它使用 Fisher-Yates shuffle 将数组随机化。对于非常长的数组来说,这可能会更有效。
关于javascript - 从数组中获取随机元素返回相同的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17040630/