我看了多篇堆栈溢出文章,找不到合理的答案。如果有重复请注明。

我有项目清单。就像是:

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中的示例

09-27 01:40