-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)生成 100 到 0 之间的数字,这是基于我的 25、25、25、25 的 4 个权重。我需要一个数字来匹配可能的情况 1-4 之一?还是我应该改变我的测试方法?

整个过程让我有点困惑,非常感谢一些帮助。

因此,基本上选择特定数字的几率为 25%。此外,我将在整个程序的生命周期中更改百分比。

4

2 回答 2

1

在测试您的号码时,您不应该“增加”您的范围吗?IE:

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

我您想使用 4 个案例进行测试,您可以测试 1 到 25 之间的数字;25 - 50; 51 - 75; 和 76-100。

您可以将开关设置为:

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

依此类推...这样您将始终获得测试结果。

希望有帮助。

于 2012-07-06T02:22:05.497 回答