ホームページ > バックエンド開発 > C++ > Boost の乱数ジェネレーターを加重乱数選択にどのように使用できますか?

Boost の乱数ジェネレーターを加重乱数選択にどのように使用できますか?

Linda Hamilton
リリース: 2024-12-15 20:43:13
オリジナル
492 人が閲覧しました

How Can Boost's Random Number Generator Be Used for Weighted Random Number Selection?

加重乱数生成

特定の確率で乱数を選択することは、プログラミングにおける一般的なタスクです。 Boost の乱数ジェネレーターは、重み付けされた確率でアイテムを選択する便利な方法を提供します。

次の重みを使用して 1 から 3 までの乱数を選択するシナリオを考えてみましょう:

  • 1: 90%
  • 2: 56%
  • 3: 4%

アルゴリズム

Boost には、重み付き乱数を生成するための機能が組み込まれていません。ただし、適用できる簡単なアルゴリズムがあります:

  1. 総重量の計算: すべてのアイテムの重量を合計します。
  2. 乱数: 0 から合計までの乱数を選択しますWeight.
  3. Iterate Through Weights: 各アイテムの重量を調べ、数値が現在のアイテムの重量より小さくなるまで乱数から減算します。
  4. 戻りアイテム: 乱数が負になった位置に対応するアイテムが選択されますitem.

コード例

Boost で、random_device および mt19937 乱数ジェネレーターを使用する:

std::mt19937 rng(std::random_device{}());
int total_weight = 90 + 56 + 4;
for (int i = 0; i < total_weight; i++) {
    int random_number = rng() % total_weight;
    int current_weight = 90;
    if (random_number < current_weight) {
        return 1;
    }
    current_weight += 56;
    if (random_number < current_weight) {
        return 2;
    }
    return 3; // Reached the end of the weights
}
ログイン後にコピー

最適化

重みの場合ほとんど変更されず、ランダムなピックが頻繁に発生する場合、各アイテムの累積重量合計を保存することで最適化を適用できます。これにより、より効率的な二分探索アプローチが可能になります。

さらに、アイテムの数は不明だが重みがわかっている場合、リザーバー サンプリングを重み付き乱数生成に適応させることができます。

以上がBoost の乱数ジェネレーターを加重乱数選択にどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート