-1

私はこれを使用して、重み付きランダムを作成しようとしています。

int choice_weight[] = { 25, 25, 25, 25 };
int num_choices = choice_weight.length;
Random random = new Random();
int i;
int sum_of_weight = 0;

for (i = 0; i < num_choices; i++) {
    sum_of_weight += choice_weight[i];
}

int rnd = random.nextInt(sum_of_weight);
System.out.println(rnd);

for (i = 0; i < num_choices; i++) {
    if (rnd < choice_weight[i])
        rnd -= choice_weight[i];
}

私はswtichステートメントを使用して、ケースが次のとおりであるかどうかをテストおよび確認しています。

case 1:

case 2:

case 3:

case 4:

問題はrandom.nextInt(sum_of_weight)、25、25、25、25の4つの重みに基づいて100から0までの数値を生成していることです。考えられるケース1〜4の1つに一致する番号が必要ですか?または、テスト方法を変更する必要がありますか?

このプロセス全体は私を混乱させるようなものです、いくつかの助けをいただければ幸いです。

したがって、基本的には、特定の番号が選択される可能性が25%になります。また、プログラムのライフサイクル全体でパーセンテージを変更します。

4

2 に答える 2

1

あなたの番号をテストするとき、あなたはあなたの範囲を「増やす」べきではありませんか?すなわち:

System.out.println(rnd);

int winner=0;
int rangeHigh=0;
for (i = 0; i < num_choices; i++) {
   rangeHigh += choice_weight[i];
   if (rnd < rangeHigh){
      winner = (i+1);
      break;
   }
}
System.out.println("lucky winner number: " + winner);

基本的に、0〜99の数値を生成し、値が次のとおりであるかどうかを確認します。

1. < 25  //bucket 1 - [0-24]
2. < 50  //bucket 2 - [25-49]
3. < 75  //bucket 3 - [50-74]
4. < 100  //bucket 4 - [75-99]

もう一度見てみると、あなたが持っている方法でも機能します(調整あり):

int winner = 0;
for (i = 0; i < num_choices; i++) {
    if (rnd < choice_weight[i]){
       winner = i+1;
       break;
    }
    rnd -= choice_weight[i];
}
于 2012-07-06T02:22:28.300 に答える
0

1から25までの数値をテストできる4つのケースを使用してテストしたかったのです。25〜50; 51-75; および76-100。

スイッチを次のように設定できます。

case 1 ((num >1)&&(num<25))... 

など...そうすれば、常にテスト結果が得られます。

お役に立てば幸いです。

于 2012-07-06T02:22:05.497 に答える