ホームページ >バックエンド開発 >C++ >Boost ライブラリを使用して重み付き乱数を生成するにはどうすればよいですか?

Boost ライブラリを使用して重み付き乱数を生成するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 20:14:10888ブラウズ

How Can I Generate Weighted Random Numbers Using the Boost Library?

Boost の重み付き乱数

Boost ライブラリは、広範な乱数生成機能を提供します。単純な乱数生成を提供しますが、重み付き乱数のサポートが組み込まれていません。この記事では、生の Boost 関数を使用して重み付き乱数ピッキングを実装する手法について説明します。

重み付きランダム化アルゴリズム

重み付き乱数を生成するには、次のアルゴリズムを使用できます。

  1. すべての合計を計算します重み。
  2. 0 と重みの合計 (両端を含む) の間の乱数を生成します。
  3. 負になるまで乱数から重みを繰り返し減算します。現在の項目のインデックスは、選択した重み付けされた数値です。

ブーストへの適応

このアルゴリズムは次のようにブーストに適応できます:

using namespace boost;

int weightedRandom(const std::vector<int>& weights) {
  // Calculate the sum of weights
  int sum = accumulate(weights.begin(), weights.end(), 0);

  // Generate a random number between 0 and the sum
  variate_generator<mt19937, uniform_int_distribution<int>> rand(generator());
  int rnd = rand(sum);

  // Traverse weights and subtract until random number becomes negative
  for (size_t i = 0; i < weights.size(); ++i) {
    if (rnd - weights[i] < 0) {
      return i;
    }
    rnd -= weights[i];
  }

  // Should never reach here
  assert(false);
}

不変のための最適化重み

重みがほとんど変更されず、リストがかなり長い場合は、累積的な重みの合計を事前計算し、二分探索を使用することで最適化できます。

未知のリスト サイズのリザーバー サンプリング

サイズが不明なリストの場合、リザーバー サンプリングを使用できます。

結論

Boost には専用の重み付き乱数関数がありませんが、提示された技術により、生の Boost 関数を使用して効率的かつ正確に生成できます。

以上がBoost ライブラリを使用して重み付き乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。