Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menjana Nombor Rawak Berwajaran Menggunakan Pustaka Boost?

Bagaimanakah Saya Boleh Menjana Nombor Rawak Berwajaran Menggunakan Pustaka Boost?

Barbara Streisand
Lepaskan: 2024-12-20 20:14:10
asal
807 orang telah melayarinya

How Can I Generate Weighted Random Numbers Using the Boost Library?

Nombor Rawak Berwajaran dalam Boost

Pustaka Boost menyediakan fungsi penjanaan nombor rawak yang meluas. Walaupun ia menawarkan penjanaan nombor rawak mudah, ia tidak mempunyai sokongan terbina dalam untuk nombor rawak berwajaran. Artikel ini meneroka teknik untuk melaksanakan pemilihan nombor rawak berwajaran menggunakan fungsi Boost mentah.

Algoritma Rawak Berwajaran

Untuk menjana nombor rawak berwajaran, kita boleh menggunakan algoritma berikut:

  1. Hitung jumlah semua pemberat.
  2. Janakan nombor rawak antara 0 dan jumlah pemberat (termasuk).
  3. Tolak pemberat secara berulang daripada nombor rawak sehingga ia menjadi negatif. Indeks item semasa ialah nombor wajaran yang dipilih.

Penyesuaian untuk Boost

Algoritma ini boleh disesuaikan dengan Boost seperti berikut:

using namespace boost;

int weightedRandom(const std::vector<int>& weights) {
  // Calculate the sum of weights
  int sum = accumulate(weights.begin(), weights.end(), 0);

  // Generate a random number between 0 and the sum
  variate_generator<mt19937, uniform_int_distribution<int>> rand(generator());
  int rnd = rand(sum);

  // Traverse weights and subtract until random number becomes negative
  for (size_t i = 0; i < weights.size(); ++i) {
    if (rnd - weights[i] < 0) {
      return i;
    }
    rnd -= weights[i];
  }

  // Should never reach here
  assert(false);
}
Salin selepas log masuk

Pengoptimuman untuk Tidak Berubah Pemberat

Jika pemberat jarang ditukar dan senarainya agak panjang, kami boleh mengoptimumkan dengan prapengiraan jumlah berat terkumpul dan menggunakan carian binari.

Pensampelan Takungan untuk Saiz Senarai Tidak Diketahui

Untuk senarai dengan saiz yang tidak diketahui, pensampelan takungan boleh digunakan dengan penyesuaian berwajaran.

Kesimpulan

Walaupun Boost tidak mempunyai fungsi nombor rawak berwajaran khusus, teknik yang dibentangkan membolehkan penjanaan yang cekap dan tepat menggunakan fungsi Boost mentah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjana Nombor Rawak Berwajaran Menggunakan Pustaka Boost?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan