0

我有一个随机生成器,我想用于 4 个项目。

我想要发生的是我希望每个项目都具有加权随机性。因此,随机性最高的当然比其他人更容易被选中。

我有 4 个项目可供随机生成器选择。

Random rand = new Random();

int itemNumber = rand.nextInt(4) + 1;

所以基本上我只是希望每个项目都能够相互权衡。我还需要能够在整个程序生命周期中更改权重。所以每个项目的重量不会是最终的。I have a pool that i use to recycle the items to save on memory so when a item is chosen it is pulled from the pool.

4

5 回答 5

4

将权重加到总和中,从该范围中选择一个随机数,然后按范围选择项目。

如果您有 4 个项目,权重分别为 4、3、2、1,那么您的总数为 10 (0-9)。0-3是第一项,4-6是第二项,7-8是第三项,9是最后一项。

于 2012-07-04T15:59:58.447 回答
1

您可以使用如下功能。传入权重 - 它会返回一个对应的随机整数,介于 1 和传入的权重数之间。

public weightedRandom(int[] weights) {
    int total = 0;
    for(int i=0; i<weights.lenght; i++) {
        total += weights[i];
    }

    int nnum = rand.nextInt(total);
    for(int i=0; nnum > 0; i++) {
        nnum -= weights[i];
    }

    return i + 1;
}
于 2012-07-04T16:00:57.977 回答
1

如果每个项目都有一个权重,那么您可以生成一个随机数 0-(sum(weights)) 并根据它所在的范围进行选择。

前任:

int weights[] = new int[]{1,2,3,4};
int sum = 10;//I'm cheating, it will need to be calculated
Random rand = new Random();
int choice = rand.nextInt(sum)+1;
for (int x = 0; x < weights.length; x++)
  if (choice-= weights[x] <=0)
    //use item X
于 2012-07-04T16:01:01.067 回答
0

创建一个可能项目的数组列表,随着项目权重的变化,将更多此类项目添加到数组中,并为随机项目调用数组的随机索引。像这样:

ArrayList<int> rand = {1,2,3,4}
//This would add more weight to the number 1
rand.add(0,1)

//then to choose a random item, just call for a random index
rand.get((int)(Math.random*rand.size())
于 2012-07-04T16:04:20.867 回答
0

刚刚写了一个小算法,首先根据百分比权重随机选择项目,然后从这些选定的项目中进行随机选择。:)

int weightPercentages[] = {50,10,20,20};

int randomPercentage =(int) (Math.floor(Math.random()*100);

int countSelected = 0;

Arraylist<Integer> selectedItems = new ArrayList<Integer>();

for(int lop=0; lop<weightPercentages.length; lop++){
     if(weightPercentage[lop]>randomPercentage)
          selectedItems.add(weightPercentage[lop]);
}

int selectedItem = (int) (Math.floor(Math.random()*selectedItems.size());

System.out.println(randomPercentage[selectedItem]);
于 2012-07-04T16:08:12.400 回答