Bagaimana untuk Menjana Nombor Rawak Teragih Biasanya dalam C/C Tanpa Boost?

Patricia Arquette
Lepaskan: 2024-11-23 00:55:16
asal
905 orang telah melayarinya

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?

Menjana Nombor Rawak dengan Taburan Normal dalam C/C

Soalan:

Bagaimana cara saya menjana nombor rawak dengan mudah mengikuti taburan normal dalam C atau C tanpa menggunakan Boost perpustakaan?

Jawapan:

Transformasi Box-Muller

Transformasi Box-Muller ialah kaedah yang digunakan secara meluas untuk menjana nombor taburan biasa daripada penjana nombor rawak seragam. Ia menghasilkan nilai yang mematuhi taburan Gaussian dengan tepat.

Formula matematik untuk transformasi Box-Muller adalah seperti berikut:

x = sqrt(-2 * log(U1)) * cos(2 * π * U2)
y = sqrt(-2 * log(U1)) * sin(2 * π * U2)
Salin selepas log masuk

di mana:

  • U1 dan U2 adalah nombor rawak teragih seragam antara 0 dan 1
  • x dan y biasanya nombor rawak teragih dengan min 0 dan sisihan piawai 1

Pelaksanaan:

Untuk melaksanakan transformasi Box-Muller dalam C/C , anda boleh menggunakan yang berikut kod:

#include <cmath>
#include <random>

double box_muller() {
  std::random_device rd;  // Seed the random number generator with a system clock seed
  std::default_random_engine rng(rd());
  std::uniform_real_distribution<double> dist(0.0, 1.0);

  double U1 = dist(rng);
  double U2 = dist(rng);

  double x = sqrt(-2 * log(U1)) * cos(2 * M_PI * U2);
  return x;
}
Salin selepas log masuk

Penggunaan:

Untuk menjana nombor rawak yang diedarkan secara normal, hanya panggil fungsi box_muller():

double random_number = box_muller();
Salin selepas log masuk

Nilai random_number akan menjadi pembolehubah rawak teragih Gaussian dengan min 0 dan sisihan piawai 1.

Nota:

  • Transformasi Box-Muller juga menghasilkan hasil kedua, y, tetapi ini boleh dibuang atau disimpan untuk kegunaan kemudian.
  • Jika anda perlu menjana nombor taburan normal dengan min selain 0 atau sisihan piawai selain 1, anda boleh darab hasil dengan pemalar.

Atas ialah kandungan terperinci Bagaimana untuk Menjana Nombor Rawak Teragih Biasanya dalam C/C Tanpa 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