Rumah > pembangunan bahagian belakang > C++ > Adakah Pustaka Rawak Baharu Benar-benar Lebih Baik Daripada `std::rand()`?

Adakah Pustaka Rawak Baharu Benar-benar Lebih Baik Daripada `std::rand()`?

Susan Sarandon
Lepaskan: 2024-10-31 07:03:30
asal
602 orang telah melayarinya

Is the New Random Library Really Better Than `std::rand()`?

Mengapa Perpustakaan Rawak Baharu Lebih Baik Daripada std::rand()?

Dalam ceramah terkenal "rand() Dianggap Memudaratkan," menggunakan pengedaran enjin paradigma untuk penjanaan nombor rawak dianjurkan ke atas penyederhanaan modulus std::rand() klasik.

Untuk menguji tuntutan yang dibuat, percubaan membandingkan std::rand() dengan std::mt19937 plus std:: uniform_int_distribution, telah dijalankan:

  1. Dua fungsi, getRandNum_Old dan getRandNum_New, telah direka untuk menjana nombor rawak antara 0 dan 5 menggunakan kedua-dua kaedah.
  2. 960,000 nombor rawak telah dijana menggunakan kedua-dua pendekatan , dan frekuensi nombor 0-5 telah dikira.
  3. Sisihan piawai bagi frekuensi telah dikira untuk 1000 simulasi.
  4. Masa yang diambil untuk kedua-dua kaedah juga direkodkan.

Anehnya, taburan agregat gulung adalah sama untuk kedua-dua kaedah, menunjukkan bahawa std::mt19937 plus std::uniform_int_distribution tidak memberikan sebarang keseragaman tambahan. Walau bagaimanapun, kaedah baharu itu kira-kira 4x lebih perlahan.

Walaupun percubaan ini nampaknya menunjukkan bahawa std::rand() tidak semestinya lebih rendah, adalah penting untuk mempertimbangkan batasan yang wujud bagi std::rand():

  • Ia menggunakan penjana kongruen linear (LCG), yang diketahui menunjukkan kelemahan tertentu seperti rawak rendah bit tertib rendah, tempoh pendek dan RAND_MAX terhad.
  • The antara muka srand mengehadkan bilangan benih permulaan (dan dengan itu menghasilkan jujukan) disebabkan fakta bahawa ia memerlukan int yang tidak ditandatangani.

Sebaliknya, pengepala dalam Pustaka Standard C:

  • Menyediakan algoritma yang ditentukan sepenuhnya dengan ciri-ciri yang dijamin.
  • Merangkum penjana dalam kelas, menghapuskan keadaan global dan masalah yang berkaitan.
  • Termasuk a lalai rawak_peranti untuk pembenihan.
  • Membenarkan pelaksanaan penjana tersuai jika dikehendaki.

Dari segi prestasi, adalah dicadangkan std::minstd_rand mungkin merupakan pengganti yang sesuai untuk std ::mt19937 apabila kualiti LCG mencukupi, berpotensi menawarkan kelajuan yang lebih baik (terutamanya apabila mengelakkan pelarasan pengedaran menggunakan uniform_int_distribution).

Akhirnya, pilihan penjana nombor rawak bergantung pada keperluan khusus aplikasi, tetapi yang baharu perpustakaan menyediakan beberapa kelebihan berbanding pelaksanaan std::rand() warisan, terutamanya untuk aplikasi yang menuntut nombor rawak berkualiti tinggi.

Atas ialah kandungan terperinci Adakah Pustaka Rawak Baharu Benar-benar Lebih Baik Daripada `std::rand()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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