Boost の重み付き乱数
Boost ライブラリは、広範な乱数生成機能を提供します。単純な乱数生成を提供しますが、重み付き乱数のサポートが組み込まれていません。この記事では、生の Boost 関数を使用して重み付き乱数ピッキングを実装する手法について説明します。
重み付きランダム化アルゴリズム
重み付き乱数を生成するには、次のアルゴリズムを使用できます。
ブーストへの適応
このアルゴリズムは次のようにブーストに適応できます:
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 サイトの他の関連記事を参照してください。