【问题标题】:is there a way to choose randomly one out of N objects in Javascript?有没有办法从Javascript中的N个对象中随机选择一个?
【发布时间】:2015-05-05 09:20:50
【问题描述】:

我们谈论的是 CSS 和 Javascript。

我希望 10 个 CSS div(一个黄色方块、一个绿色方块和一个红色方块...)在 1-3 秒的时间段后随机出现在屏幕上。

问题:

  • 从 10 个(通常为 N 个)对象中选择一个随机出现: 我必须在 Math.random() 方法的基础上使用 if 在 0 和 0,1 之间选择第一个对象,如果在 0,1 和 0,2 之间选择第二个对象等。 , 还是有更可扩展的方式?

编辑:似乎我以错误的方式传达了问题。我知道 Math.random() 是一个可扩展的解决方案,但要写 如果这不是 10(或 N)次不是。那么我如何让计算机从 10 个(或 N 个)元素中取出一个。我从 dystroy 得到了最好的答案 - 获取一个数组并将其随机播放,然后获取第一个元素。谢谢!

【问题讨论】:

  • 打乱一个数组,然后选择前N个元素。
  • 更具可扩展性是什么意思?重新表述您提出的解决方案,对于任何 N,您可以使用 Math.floor(Math.random()*N) 作为随机索引。
  • 尝试方法从这个问题stackoverflow.com/questions/1527803/…产生特定范围内的随机数
  • 我的意思是求解 N,而不仅仅是 10

标签: javascript math random


【解决方案1】:

Date.now() % 10。将 10 替换为 div 的数量。 now 函数提供纪元毫秒数。

请注意,在生成的数字序列通过随机性统计测试(至少与专用生成器处于同一级别)的意义上,此解决方案不会产生 真正 随机选择。但是,出于实际目的,它就足够了(意思是除非您每隔几毫秒调用一次now 和/或将对now 的调用计时到计时器;我认为这两者都不可能以可靠的方式进行)。

【讨论】:

  • 只是为了指出一点:这不是随机的。但是,如果用户想以某种方式尝试在 精确 毫秒内执行某些操作以获得他们想要的 div,那么祝他们好运。 :-)(例如,它可能是随机的足够。)
  • @T.J.Crowder 感谢您指出(不是这样;-))显而易见的。答案补充
【解决方案2】:

Math.random 是完全可扩展的。 :-)

var index = Math.floor(Math.random() * 10);

...将为您提供从09 的索引。 一般公式为:

value = Math.floor(Math.random() * (max - min)) + min;

...要获得min <= value < max 范围内的值,但是当min0 时(就像从典型数组中选择事物时一样),显然我们可以稍微简化一下。

【讨论】:

  • Math.random 有时可能会返回 0.00718739,我刚刚检查过。所以乘以 10 可能并不总是有效
  • @wishy 因子10 只是将输出范围从[0,1[ 缩放到[0, 10[。注意0 是一个有效的数组索引!
  • @Wishy:如果数组中有 10 个项目,则索引为 0、1、2、3、4、5、6、7、8 和 9。所以 Math.floor(Math.random() * 10) 有效,它会随机为您提供这些索引之一。
  • @TJCrowder,是的,我在分析时错过了(+ 分钟)。不错的一个:)
【解决方案3】:

这应该对您有所帮助。 注意:Math.random 有时可能会得到 0.0071 或 0.071 等,这意味着小数点后有多个 0,因此更安全的是 10000。

function getRandomNumber(curNumber) {
    var limit = 10;
    var minDecConv = 10000;
    var randomNumberWithinLimit = (Math.random() * minDecConv) % limit;
    if(randomNumberWithinLimit == curNumber) {
        return getRandomNumber(curNumber);
    }
    else {
        return randomNumberWithinLimit; //for better understanding, you can return directly
    }

}

var curNumber = 0;
var randomNo = getRandomNumber(curNumber);

【讨论】:

  • 这对@TJCrowder 的回答没有任何改进——Math.random()[0, 1[ 区间内模拟均匀分布,无需纠正失真
  • 两者 var index = Math.floor(Math.random() * 10);和值 = Math.floor(Math.random() * (max - min)) + min;在这种特殊情况下无济于事!这不是扭曲,它甚至不会给出 0 到 10 之间的所需值!
  • 当然可以——只需在浏览器的 js 控制台中测试它。如果您想包含10,请使用11 作为因子。顺便说一句,你为什么要提防相同的连续结果?掷骰子,你也可能得到 6 点...
  • @collapsar - 如果答案不正确,您可以投反对票!当方法不是最佳时,则不是。该方法也与 Crowders 不同
  • 目前的答案是错误的:OP 想要在多个 div 中随机选择,基于均匀分布(他使用 Math.random 证明了这一点。他没有排除相同的结果在连续的选择中(事实上,这些在他以前的设置中会经常发生)。请注意,OP 并不关心他的解决方案的统计属性,而是担心性能问题。
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 2021-03-17
  • 2020-11-30
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多