0

4つのアイテムに使用したいランダムジェネレーターがあります。

私がしたいのは、各アイテムに加重ランダム性を持たせたいということです。したがって、もちろん、ランダム性が最も高いものが他のものよりも多く選択されます。

ランダム ジェネレーターが選択できる項目は 4 つあります。

Random rand = new Random();

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

だから基本的には、各アイテムがお互いに重みを持つことができるようにしたいだけです. また、プログラムのライフサイクル全体で重みを変更できる必要があります。したがって、各アイテムの重量は最終的なものではありません。私はアイテムをリサイクルしてメモリに保存するために使用するプールを持っているので、アイテムが選択されるとプールから引き出されます。

4

5 に答える 5

4

合計まで重みを追加し、その範囲から乱数を選択し、範囲で項目を選択します。

それぞれの重みが 4、3、2、1 の 4 つのアイテムがある場合、合計は 10 (0-9) です。0-3 は最初の項目、4-6 は 2 番目の項目、7-8 は 3 番目の項目、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 に答える