0

ボタンがあります。ユーザーがボタンをクリックして、変数(0〜100)を受信action1またはaction2依存します。percent_to_action2彼に与える最も簡単な方法はaction1action2に基づいてrand() % 100おり、と比較していpercent_to_action2ます。

しかし、問題は、例えば、最初のランダムユーザーが(rand()によって)取得するperfect_to_action = 50という保証はありません。私は多くの繰り返しの行動を避ける方法を探しています。前のイベントまたはすべてのイベントを考慮して、より正確にカウントする方法を提案してください。例とコメント付き。目標は、rund()が提供できる過剰な数の繰り返しアクションを回避することです。たとえば、パーセント= 50の場合、rand()は10/10アクション2を与えることができます。action1action2

ps。perfect_to_actionいつでも変更できます。
pps。英語でごめんなさい。

私のコード:

                int num_rand = (rand() % 100 ) + 1; // from 1 to 100
                if (  num_rand <= current_percent_to_action2 )
                {
                    // action 1
                } else {} // action2

例で欲しいもの:

パーセント=50:action1よりaction2よりaction1よりaction2など。

パーセント=33:(最初にrandで)最初のaction1がaction1よりaction2よりaction1よりaction1よりaction2よりも大きい場合など。

4

2 に答える 2

1
static unsigned num_action_1 = 1;
static unsigned num_action_2 = 1;
double bias = double(num_action_2)/num_action_1;
double randomchance = 1.0-current_percent_to_action2/100.0;
double action_1_cutoff = RAND_MAX*randomchance*bias;
if (  rand() <= action_1_cutoff ) {
    // action 1
    ++num_action_1;
} else {
    // action2
    ++num_action_2;
} 

これにより、発生頻度の低いオプションにランダム性が偏ります。current_percent_to_action2また、コードのようにアクション1ではなく、アクション2がほぼパーセントで発生するように変更しました。このグラフからわかるように、複雑さが増しますが、結果の数が不均衡になる可能性ははるかに低くなります。長期的には、これらは実質的に同じになりますが、どちらも最終的には10の文字列を連続して提供し、このコードははるかに均一に開始されます。

times #1     Even distribution    Biased distribution
    1               50%                  50%
    2               25%                   8.3%
    3               12.5%                 3.125%
    4                6.25%                1.25%
    5                3.13%                0.52%
    6                1.56%                0.22%
    7                0.78%                0.09%
    8                0.39%                0.04%
    9                0.20%                0.02%
    10               0.10%                0.01%
于 2012-05-22T23:54:34.277 に答える
0

アクションを繰り返したくない場合は、a)すべてから最後のアクションを選択するか、b)現在と同じように選択しますが、前のアクション以外のものが得られるまで再選択を続けます。後者の方が簡単ですが、遅くなります(おそらくかなり遅くなります)。

于 2012-05-22T23:21:04.793 に答える