JavaScript加权随机或时间百分比

我有一个每100ms运行一次的Node.js进程(setInterval)。 我每隔一段时间就要采取一些行动。 例如,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)至less接近10%的时候,你会想要,但是有时它可能是连续的10倍,或者根本不是。

如果我们假设100ms的时间间隔是固定的,那么有没有人会有更好的解决scheme的build议?

谢谢!

编辑:根据Dredel博士的评论:

 var count = 0; setInterval(function(){ if(count++ % 4 == 0) { console.log('25% of the time'); } }, 100);​ 

如果你的时间间隔是固定的,我会围绕你的邮票到最近的一百个,然后使用那些与你的需求相关的部分…… 100和200但不是300-1000来代表2%。

如果你可以使用计数器,那么这是更明显的方法。

 if(myCounter++ % 4 == 0) //this happens 25 percent of the time 

正如Emil所指出的那样,这里的可能性并不是正确的方法,我不明白你已经嫁给了它……听起来好像你在使用它,因为你没有看到一个更好的方法来挑起有一些事情发生在x%的时间。 如果我们误解了你,你需要更详细地解释为什么你在这里使用赔率。

介绍一个柜台和BAM! 现在你可以有2%的时间!

认真地说,引入某种状态是你执行“不要太多次”政策的唯一方法。 概率/随机性不能帮你解决这个问题。 随机事件不可能连续发生的信念是一个众所周知的神话。 事实上,2%的可能事件可能会连续发生数百万次,尽pipe这是不太可能的。

您将需要添加一个约束,例如“ 我希望事件发生x%概率,但是我总是希望它在每个事件之后至less进行y步 ”。

如果你想保证你的操作发生了一个确切的时间百分比(而不是随机的),但是你希望它们是以随机的顺序被选中的,那么你可以按照这样的方式创build一个数据结构你想要的确切结果是通过所有元素迭代的。 然后,您随机选取其中一个结果,将其从数据结构中移除,随机选取另一个结果等等。

如果您将每个结果的适当百分比的初始数据结构进行sorting,那么您将根据该规则得到结果,并且对于每次完整的迭代,您将得到每个结果的期望数量,但是将以随机顺序而且这个顺序每次都会有所不同。

如果你想要一遍又一遍地重复这个过程,你可以在每次完成一次完整的迭代时重新开始它。

 var playProbabilities = [ {item: "A", chances: 3}, {item: "B", chances: 2}, {item: "C", chances: 1}, {item: "D", chances: 2}, {item: "E", chances: 1}, {item: "F", chances: 1} ]; function startPlay(items) { var itemsRemaining = []; // cycle through the items list and populate itemsRemaining for (var i = 0; i < items.length; i++) { var obj = items[i]; // for each item, start with the right number of chances for (var j = 0; j < obj.chances; j++) { itemsRemaining.push(obj.item); } } return(itemsRemaining); } function nextPlay(itemsRemaining) { if (!itemsRemaining.length) { return null; } // randomly pick one var rand = Math.floor(Math.random() * itemsRemaining.length); var result = itemsRemaining[rand]; // remove the one we picked from the array itemsRemaining.splice(rand, 1); return(result); } $("#go").click(function() { var results = $("#results"); var items = startPlay(playProbabilities); var next; while(next = nextPlay(items)) { results.append(next + "<br>"); } results.append("-------------<br>"); }); 

在这里工作演示: http : //jsfiddle.net/jfriend00/x2v63/

如果您运行演示,您会看到每次运行都会产生所需的每个结果的数量,但是它们是按随机顺序select的。

Interesting Posts