1

オブジェクトをランダムに生成するシステムを含む小さなアプリを実行しています。手順は次のとおりです

各オブジェクトには、オブジェクトの「タイプ」を指定するフィールドがあります。火、氷、風としましょう (ただし、アプリ内の実際のものではありません) 各タイプには、そのタイプが生成される可能性を決定する「可能性」と呼ばれるフィールドがあります。このフィールドのデフォルト値はもちろん 1/numberOfTypes です。タイプのもう 1 つのフィールドは、リスト内の「順序」です。たとえば、火が 1 番目、氷が 2 番目、風が 3 番目であるとします。

これに対する私の単純な解決策は、それを使用 Math.floor(Math.random()*100 / defualtPossibilities)して type.oder と一致させることです。したがって、ランダム値が .75 で、3 つのタイプがある場合、Math.floor(...)これreturn 2はオブジェクトが氷のオブジェクトであることを意味します。

ただし、いくつかの潜在的な問題があります。

  1. 各タイプの可能性の値を変更することが可能です。この場合でも、乱数を生成し、乱数を超えるまでループを使用して各type.order*type.possibilitiesをチェックできます。しかし、それを行うより良い方法があるかどうかはわかりません。

  2. 一方のtype.possibilitiesを変更すると、もう一方のタイプ。可能性の合計を 100 に保つためには、可能性を変更する必要があります。変更量を他のすべてのタイプに均等に分割することで、これを行う予定です。それは良いアプローチですか?

曖昧なところがあり申し訳ありませんがよろしくお願いします^ - ^

皆さん、ありがとうございました!

4

1 に答える 1

1

ここに短い解決策があります:

 float weights[]; // each >0

 public int nextIndex() {     
     float sum =0;
     for (int i=weights.length; i-->0;) sum+=weights[i];
     float r = myrandom.nextFloat()*sum;
     sum = 0;
     for (int i=0; i<weights.length-1; i++) {
         sum += weights[i];
         if (r<sum) return i;
     }
     return weights.length-1;
 }

各重みを個別に変更できます。アイデアは、100 であると仮定するのではなく、単純に重みの合計を再計算することです。

明らかに、最高のパフォーマンスを得るには、合計を事前に計算できます。

于 2012-05-14T13:38:59.967 に答える