javascript - 从数组中获取随机元素返回相同的元素

标签 javascript jquery random

请引用下面的代码。

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/

相关文章:

javascript - 由 Javascript 添加的 Img 显示 0x0 像素

javascript - 如何处理查询中的多个 id,因为我在以下代码中遇到问题

javascript - 如何在拖动时调整 div 的大小? [轮换问题]

javascript - 如何通过 Apps 脚本更改 Google 表格中的多个单元格值?

jQuery UI 可排序事件问题

jQuery data() 对象转 JSON 字符串

python - 将随机值分配给python程序中的参数

用 C 创建自己的随机生成器

javascript - 如何创建一个基于两个变量的条件字符串,而无需一堆 if else (JavaScript)

javascript - 在滚动上独立移动 2 个不同高度的 div