Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimanakah Penjanaan Nombor Rawak Berwajaran Boleh Dioptimumkan untuk Kecekapan?

Bagaimanakah Penjanaan Nombor Rawak Berwajaran Boleh Dioptimumkan untuk Kecekapan?

DDD
DDDasal
2024-11-14 11:56:02446semak imbas

How Can Weighted Random Number Generation Be Optimized for Efficiency?

Generate Weighted Random Numbers

Weighted random number generation involves selecting a random number from a range where the probability of each number is determined by a weight. This task arises in various applications, such as simulations and games.

Initial Solution

A common approach is rejection sampling, as exemplified in the provided ColdFusion code. This method involves creating a lookup table with elements distributed according to their weights. However, this approach has limitations, such as linear overhead in building the table and potential memory consumption issues.

Alternative Strategies

  • Linear Summing: Another strategy involves iteratively summing the weights until the sum exceeds a randomly generated number in the range [0,1). The associated value is then returned. This approach has no upfront costs but a linear time complexity.
  • Reservoir Sampling: This method involves selecting a random sample from a stream of elements. As each element is encountered, it is added to the reservoir with a probability proportional to its weight. The reservoir size remains fixed, ensuring a constant time complexity.
  • Alias Sampling: This technique utilizes a precomputed table to select random numbers from a weighted distribution. It guarantees a constant time complexity and is generally more efficient than the other approaches for large or highly skewed weight distributions.

Implementation

An implementation of weighted random number generation in JavaScript using alias sampling:

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;
  }
}

Atas ialah kandungan terperinci Bagaimanakah Penjanaan Nombor Rawak Berwajaran Boleh Dioptimumkan untuk Kecekapan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn