9

構造体の配列があり、構造体のフィールドの 1 つが float です。それを選ぶ確率が float の値に比例する構造体の 1 つを選びたいと思います。すなわち

struct s{
  float probability;
  ...
}

s sArray[50];

どちらを選択するかを決定する最速の方法は何ですか? これのための機能はありますか?すべての確率フィールドの合計がわかっている場合 (1 ではないことに注意してください)、各 s を反復処理して乱数と比較probability/total_probabilityし、各 s の乱数を変更できますか? すなわち

if( (float) (rand() / RAND_MAX) < probability)...
4

2 に答える 2

11
float p = (rand() / static_cast<float>(RAND_MAX)) * total_probability;
s* current = &sArray[0];
while ( (p -= current->probability) > 0)
    ++current;
// `current` now points to your chosen target
于 2010-04-15T23:52:47.520 に答える
3

あなたが言うようにRAND_MAXを見つけてください。RAND_MAX までの乱数を生成します。生成された乱数と同じかそれを超えるまで、配列を反復して確率をカウントアップします。(要素が 50 個しかない場合、パフォーマンスは問題にならないはずです。それ以外の場合は、確率の合計を別の配列に一度格納してから、二分探索を行ってランダム値を求めます。)

于 2010-04-15T23:49:13.483 に答える