我看了多篇堆栈溢出文章,找不到合理的答案。如果有重复请注明。
我有项目清单。就像是:String giantRat []={"Bandage", "Healing Potion", "Minor Healing Potion", "Rat Teeth", "Fur", "Rat Tail", ""};
这表示此giantRat
可能删除的项目。
有一个具有匹配索引的相关数组,可以保存我希望发生的加权概率。就像是:int giantRatDropRate[]={1,1,1,6,8,3,5};
这些将按比例放大到50个(每个乘以2),然后从理论上讲,我将扮演一个50面的骰子(Random
)。看来这是错误的方法,我想不出办法。
同样,这个想法是掷骰子并根据权重从列表中选择一项。也许掷骰子是错误的方法。任何帮助表示赞赏。
最佳答案
一种简单的方法如下。无需* 2,因为概率将相同。
String giantRat []={"Bandage", "Healing Potion", "Minor Healing Potion", "Rat Teeth", "Fur", "Rat Tail", ""};
int[] a = {1,1,1,6,8,3,5};
int sum = 0;
for(int i: a)
sum += i;
Random r = new Random();
int s = r.nextInt(sum); //Get selection position (not array index)
//Find position in the array:
int prev_value = 0;
int current_max_value = 0;
int found_index = -1;
for(int i=0; i< a.length; i++){ //walk through the array
current_max_value = prev_value + a[i];
//is between beginning and end of this array index?
boolean found = (s >= prev_value && s < current_max_value)? true : false;
if( found ){
found_index = i;
break;
}
prev_value = current_max_value;
}
String selection = "unknown";
if( found_index != -1 ){
selection = giantRat[found_index];
}
System.out.println(selection);
http://ideone.com/xyQlvN中的示例