2

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ミリ秒の間隔が固定されていると仮定した場合、より正確な解決策を提案してくれる人はいますか?

ありがとうございました!

編集: ドレデル博士のコメントに基づく:

var count = 0;
setInterval(function(){

    if(count++ % 4 == 0) {
       console.log('25% of the time');
    }

}, 100);​
4

3 に答える 3

5

間隔が固定されている場合は、スタンプを最も近い 100 に丸めてから、ニーズに関連するセグメントを使用します... 100 と 200 で、300-1000 ではなく 2% を表します。

カウンターを使用できる場合は、それがより明白な方法です。

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

Emil が指摘しているように、ここでは確率は正しいアプローチではありません。あなたがそれと結婚しているとは思えません...挑発するためのより良い方法を見つけられなかったので、確率を使用しているように思えます。 x% の確率で何かが起こる。私たちがあなたを誤解している場合は、ここでオッズを使用している理由をより詳細に説明する必要があります.

于 2012-06-22T00:17:26.873 に答える
1

カウンターとBAMを導入!これで、正確に2% の確率で使用できます。

真剣に、ある種の状態を導入することが、「連続してあまり多くない」ポリシーを強制する唯一の方法です。確率/ランダム性は、この問題を解決するのに役立ちません。ランダムなイベントが連続して何度も発生することはあり得ないという信念は、よく知られた神話です。実際、確率が 2% のイベントが何百万回も連続して発生する可能性はありますが、その可能性は非常に低いです。

「イベントを x% の確率で発生させたいが、各イベントの後に少なくとも y ステップは常に発生させたい」などの制約を追加する必要があります。

于 2012-06-22T00:17:39.603 に答える
0

操作が(偶然に任せるのではなく)正確な割合で行われることを保証したいが、それらをランダムな順序で選択したい場合は、データ構造を作成する場所でこのようなことを行うことができますすべての要素の 1 回の反復で必要な正確な結果。次に、それらの結果の 1 つをランダムに選択し、それをデータ構造から削除し、別の結果をランダムに選択します...

各結果の適切なパーセンテージで初期データ構造をシードすると、そのルールに従って結果が得られ、完全な反復ごとに、各結果の正確な数が得られますが、それらはランダムな順序で選択されますその順序は毎回異なります。

プロセスを何度も繰り返したい場合は、完全な反復が 1 回完了するたびにプロセスをやり直すことができます。

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/

デモを実行すると、実行ごとに、各結果の正確な数が生成されることがわかりますが、それらはランダムな順序で選択されます。

于 2012-06-22T03:39:42.647 に答える