2

たとえば、集合 S = {0, 1, 2, 3} から乱数を取得したいとします。しかし、各数値が同じ確率 (25%) で表示されるのではなく、数値ごとに異なる確率、たとえば {50%, 30%, 20%, 10%} とします。これをどのようにコーディングしますか?Java または C# (私は C# の方が好きです)。

4

2 に答える 2

3

Alias メソッドは、これを行うための私のお気に入りです。

http://code.activestate.com/recipes/576564-walkers-alias-method-for-random-objects-with-diffe/

私はこのコードをレビューしていませんが、Google のトップの結果です。

ここに別のより良い説明があります

http://pandasthumb.org/archives/2012/08/lab-notes-the-a.html

実際、私はこの質問をインタビューでかなり頻繁に使用しています。

上記を実装するには多すぎる場合は、入力ソリューションを通る単純な 1 つのループがあります。

コードを表示するだけの方が簡単なので、PHP を使用します。

function getNumberFromDistribution($dist) {
    $totalProbability = 0;
    $randomNumber = mt_rand(0, mt_getrandmax()) / mt_getrandmax();  //uniform random number between 0-1
    foreach($dist as $number => $chance) {
        if (($totalProbability += $chance) <= $randomNumber) {
            return $number;
        }
    }

    return null; //only reachable on bad input
}
于 2013-03-06T02:16:30.033 に答える
0

セットが小さい場合は、分布を取得するために必要な各値の正しい数を含む配列を作成できます。1 1 1 2 2 3は、3を取得する場合の3倍の確率で1を取得します。次に、配列の長さを使用して、インデックスとして使用する乱数を決定します。

于 2013-03-06T02:19:53.563 に答える