2012-07-06 13 views
-1

我用这来尝试创建一个加权随机:使用switch语句来测试加权随机数

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]; 
} 

我使用的是马桶盖语句来测试,看看情况是:

case 1: 

case 2: 

case 3: 

case 4: 

问题是random.nextInt(sum_of_weight)正在生成100到0之间的数字,这是基于我的25,25,25,25的4个权重。我需要一个数字来匹配其中一个可能的情况1-4?还是应该改变我的测试方法?

这整个过程是有点让我困惑,有些帮助将不胜感激。

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

+0

开关在哪里起作用? – 2012-07-06 02:19:56

+0

它选择了一个精灵放置到场景中 – 2012-07-06 02:38:23

+0

问题的标题“使用switch语句测试加权随机数”很具误导性 - 问题与switch语句无关(顺便提一下,许多人认为是邪恶的,但那是另一回事)。我也没有看到“问题”究竟是什么...... – 2012-07-06 02:58:26

回答

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] 

在第二看你有它也可以工作的方式(W /调整) :

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

那么,如果我在程序生命周期中改变百分比,会发生什么?例如,而不是它是25,25,25,25我把权重改为60,10,10,20 ?? – 2012-07-06 02:38:06

+0

它会没问题。你的范围是基于你的数组..范围将是[0-59,60-69,70-79,80-99]。你甚至可以超过100,它应该仍然是好的。 – 2012-07-06 02:39:25

+0

谢谢很多人!我现在完全理解它,它已经运行起来了! – 2012-07-06 02:51:35

0

我想用4种情况测试1到25之间的数字; 25 - 50; 51 - 75;和76-100。

您可以将您的开关设置为一样的东西:

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

等等......这样,你将永远有一个测试结果。

希望有所帮助。