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

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

Susan Sarandon
Susan Sarandonasal
2024-10-31 07:03:30467semak imbas

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:
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