ホームページ >ウェブフロントエンド >jsチュートリアル >加重乱数生成を効率的に最適化するにはどうすればよいですか?

加重乱数生成を効率的に最適化するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-14 11:56:02498ブラウズ

How Can Weighted Random Number Generation Be Optimized for Efficiency?

加重乱数の生成

加重乱数の生成では、各数値の確率が次の条件で決定される範囲から乱数を選択します。重さ。このタスクは、シミュレーションやゲームなどのさまざまなアプリケーションで発生します。

初期解決策

一般的なアプローチは、拒否サンプリング です。 ColdFusion コードを提供しました。この方法では、要素が重みに従って分散されたルックアップ テーブルを作成します。ただし、このアプローチには、テーブル構築時の線形オーバーヘッドや潜在的なメモリ消費の問題などの制限があります。

代替戦略

  • 線形加算: 別の戦略には、合計が [0,1) の範囲でランダムに生成された数値を超えるまで重みを繰り返し合計することが含まれます。関連付けられた値が返されます。このアプローチには、前払いコストはありませんが、直線的な時間計算量が必要です。
  • リザーバー サンプリング: この方法には、要素のストリームからランダムなサンプルを選択することが含まれます。各元素が検出されると、その重量に比例した確率でリザーバーに追加されます。リザーバ サイズは固定されたままで、一定の時間計算量が保証されます。
  • エイリアス サンプリング: この手法では、事前計算されたテーブルを利用して、重み付けされた分布から乱数を選択します。これは、一定の時間計算量を保証し、一般に、大きなまたは非常に偏った重み分布に対して他のアプローチよりも効率的です。

実装

重み付きランダムの実装エイリアスサンプリングを使用した JavaScript での数値生成:

function weightedRand(weights) {
  // Build the alias table
  let table = [];
  let totalWeight = 0;
  for (let i = 0; i < weights.length; i++) {
    totalWeight += weights[i];
  }
  for (let i = 0; i < weights.length; i++) {
    let prob = weights[i] / totalWeight;
    let alias = i;
    table.push({ prob: prob, alias: alias });
  }
  
  // Generate a random number
  return function() {
    let r = Math.random() * totalWeight;
    let i = 0;
    let alias = -1;
    while (i < table.length && alias === -1) {
      if (r < table[i].prob) {
        alias = i;
      } else {
        r -= table[i].prob;
        i = table[i].alias;
      }
    }
    return alias;
  }
}

以上が加重乱数生成を効率的に最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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