【发布时间】:2012-06-24 07:20:31
【问题描述】:
我有一个每 100 毫秒运行一次的 Node.js 进程 (setInterval)。我有一些我想每隔 x 时间采取的行动。例如,2% 的时间做 X,10% 的时间做 Y,等等。
现在,我基本上是这样做的:
var rand = Math.floor(Math.random() * (1000 + 1));
if(rand > 900) { // Do something }
if(rand > 950) { // Do something }
问题是它非常不一致。您可能希望if(rand > 900) 至少接近 10% 的时间,但有时可能连续 10 倍或根本没有。
如果我们假设 100 毫秒的时间间隔是固定的,那么任何人都可以提出更准确的更好解决方案的建议。
谢谢!
编辑:基于 Dr. Dredel 的 cmets:
var count = 0;
setInterval(function(){
if(count++ % 4 == 0) {
console.log('25% of the time');
}
}, 100);
【问题讨论】:
-
为您要执行的每个单独的子流程创建一个
setInterval是不可能的吗? -
我不确定我是否明白你在问什么。您可能会随机获得 10% 的事件连续发生多次或根本不发生。
-
欢迎来到概率世界! - en.wikipedia.org/wiki/Probability(这是一个疯狂的世界,受过教育的人可能无法理解
World of Warcraft玩家会做什么) -
您似乎想控制分布,以便如果 y 在 8 次迭代中没有发生,则增加它的概率,反之,如果它在 4 次迭代中发生两次,则减少它可能性。您可能还想确保永远不会连续获得两个 y。如果你想要的话,我敢肯定有一个相当简单的算法。它不会是完全随机的,但可能就足够了。
-
仅供参考,你可以在这里玩随机性:jsfiddle.net/jfriend00/wEufz。正如其他人所说,如果您希望在少量迭代中精确地达到 n% 的时间,那么您不能使用 random,因为它只会在大量迭代时为您提供预期的结果。
标签: javascript node.js random weighted