Rumah  >  Artikel  >  hujung hadapan web  >  Cara Menjana Nombor Rawak Berwajaran dalam Pengaturcaraan: Pensampelan Penolakan lwn Carian Berulang?

Cara Menjana Nombor Rawak Berwajaran dalam Pengaturcaraan: Pensampelan Penolakan lwn Carian Berulang?

DDD
DDDasal
2024-11-13 13:55:02398semak imbas

How to Generate Weighted Random Numbers in Programming: Rejection Sampling vs. Iterative Search?

Menjana Nombor Rawak Berwajaran dalam Pengaturcaraan

Nombor rawak berwajaran mencari aplikasi dalam pelbagai senario di mana nilai tertentu dalam julat mempunyai kebarangkalian yang berbeza untuk dipilih. Dalam artikel ini, kami meneroka dua pendekatan yang berkesan untuk mencapai matlamat ini:

Pendekatan pertama, yang dicadangkan oleh penyoal asal, melibatkan Persampelan Penolakan. Kaedah ini mencipta jadual carian yang diisi dengan elemen dalam julat, di mana setiap elemen muncul beberapa kali berkadar dengan beratnya. Selepas itu, indeks rawak dipilih daripada jadual carian untuk mendapatkan nombor rawak. Pertukaran di sini terletak pada kerumitan masa linear untuk membina jadual carian dan potensi penggunaan memori untuk spesifikasi berat yang besar.

Sebagai alternatif, kaedah Carian Berulang mengira jumlah pemberat secara berulang semasa merentasi spesifikasi berat. Ia membandingkan jumlah ini dengan nombor yang dijana secara rawak antara 0 dan 1. Jika jumlah tersebut melebihi nombor rawak, nilai yang sepadan dikembalikan sebagai nombor rawak. Tidak seperti pensampelan penolakan, pendekatan ini tidak memerlukan kos pendahuluan tetapi menunjukkan purata kerumitan masa yang linear kepada bilangan entri dalam spesifikasi berat.

Untuk menunjukkan kedua-dua pendekatan dalam JavaScript:

// Rejection Sampling
function weightedRand(spec) {
  var i, j, table = [];
  for (i in spec) for (j = 0; j < spec[i] * 10; j++) table.push(i);
  return function() { return table[Math.floor(Math.random() * table.length)]; };
}
var rand012 = weightedRand({0:0.8, 1:0.1, 2:0.1});

// Iterative Search
function weightedRand2(spec) {
  var i, sum = 0, r = Math.random();
  for (i in spec) { sum += spec[i]; if (r <= sum) return i; }
}

The pilihan pendekatan bergantung pada keperluan aplikasi khusus, mengimbangi kerumitan masa, penggunaan memori, dan tingkah laku deterministik. Pensampelan penolakan menawarkan carian masa tetap pada kos pembinaan jadual awal, manakala carian lelaran menyediakan pelaksanaan yang lebih mudah dengan prestasi masa linear. Dengan memanfaatkan teknik ini, pengaturcara boleh menjana nombor rawak berwajaran dengan berkesan untuk pelbagai keperluan pengaturcaraan mereka.

Atas ialah kandungan terperinci Cara Menjana Nombor Rawak Berwajaran dalam Pengaturcaraan: Pensampelan Penolakan lwn Carian Berulang?. 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