Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menjana Nombor Rawak Teragih Biasanya dalam C/C Tanpa Boost?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-23 00:55:16977semak imbas

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)

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

Penggunaan:

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

double random_number = box_muller();

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!

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