Rumah >hujung hadapan web >tutorial js >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:02502semak imbas

How Can Weighted Random Number Generation Be Optimized for Efficiency?

Jana Nombor Rawak Berwajaran

Penjanaan nombor rawak berwajaran melibatkan pemilihan nombor rawak daripada julat di mana kebarangkalian setiap nombor ditentukan oleh berat badan. Tugas ini timbul dalam pelbagai aplikasi, seperti simulasi dan permainan.

Penyelesaian Awal

Pendekatan biasa ialah pensampelan penolakan, seperti yang ditunjukkan dalam menyediakan kod ColdFusion. Kaedah ini melibatkan penciptaan jadual carian dengan elemen diedarkan mengikut beratnya. Walau bagaimanapun, pendekatan ini mempunyai had, seperti overhed linear dalam membina jadual dan isu penggunaan memori yang berpotensi.

Strategi Alternatif

  • Penjumlahan Linear: Strategi lain melibatkan menjumlahkan pemberat secara berulang sehingga jumlahnya melebihi nombor yang dijana secara rawak dalam julat [0,1). Nilai yang berkaitan kemudiannya dikembalikan. Pendekatan ini tidak mempunyai kos pendahuluan tetapi kerumitan masa linear.
  • Pensampelan Takungan: Kaedah ini melibatkan pemilihan sampel rawak daripada aliran unsur. Apabila setiap elemen ditemui, ia ditambah kepada takungan dengan kebarangkalian berkadar dengan beratnya. Saiz takungan kekal tetap, memastikan kerumitan masa yang berterusan.
  • Persampelan Alias: Teknik ini menggunakan jadual prapengiraan untuk memilih nombor rawak daripada taburan berwajaran. Ia menjamin kerumitan masa yang berterusan dan secara amnya lebih cekap daripada pendekatan lain untuk pengagihan berat yang besar atau sangat condong.

Pelaksanaan

Pelaksanaan rawak berwajaran penjanaan nombor dalam JavaScript menggunakan pensampelan alias:

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