使用switch语句测试加权随机数

时间:2012-07-06 02:08:11

标签: java

我正在使用它来尝试创建加权随机:

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之间的数字,这是基于我的4个权重25,25,25,25。我需要一个数字来匹配其中一个可能的案例1-4?或者我应该更改我的测试方法?

这整个过程让我感到困惑,一些帮助将不胜感激。

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

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

您可以将开关设置为:

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

等等......这样你就会有一个测试结果。

希望有所帮助。