Mengapakah perpustakaan `` dalam C lebih disukai daripada `rand()`?

DDD
Lepaskan: 2024-11-03 17:00:03
asal
113 orang telah melayarinya

Why is the `` library in C   preferred over `rand()`?

Mengapa perpustakaan rawak baharu lebih baik daripada rand()?

Kebimbangan kontemporari mengenai rand() telah mencetuskan perbincangan tentang penggunaan nombor rawak unggul prosedur penjanaan (RNG) berdasarkan paradigma pengedaran enjin, berbanding dengan std::rand() konvensional dan pendekatan modulo. Untuk mendapatkan pemahaman langsung tentang kelemahan rand(), percubaan pantas telah dijalankan.

Dua fungsi telah dicipta, getRandNum_Old() dan getRandNum_New(), memanfaatkan std::rand() dan std: :mt19937 dengan std::uniform_int_distribution masing-masing, untuk menjana nombor rawak antara 0 dan 5. 960,000 nombor rawak telah dijana menggunakan setiap kaedah, dan kekerapan setiap nombor (0-5) telah direkodkan. Sisihan piawai berfungsi sebagai metrik, dengan nilai yang lebih rendah menunjukkan taburan yang lebih seragam. Proses ini diulang 1000 kali, dan masa yang diambil untuk setiap lelaran diukur.

Anehnya, pengedaran gulungan adalah serupa dalam kedua-dua kaedah. Kaedah baru adalah lebih kurang 4x lebih perlahan. Nampaknya peningkatan kelajuan datang dengan kos peningkatan minimum dalam kualiti.

Walau bagaimanapun, perbezaan penting terletak pada pelaksanaan RNG itu sendiri. Banyak pelaksanaan rand() menggunakan Penjana Kongruen Linear (LCG), yang biasanya bukan yang paling teguh. Walaupun kelazimannya, mereka biasanya menghasilkan keputusan yang boleh diterima dalam ujian asas seperti yang dijalankan.

Kekurangan pelaksanaan subpar rand() termasuk rawak rendah dalam bit tertib rendah, tempoh pendek, RAND_MAX rendah dan korelasi antara berturut-turut pengekstrakan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pengehadan ini tidak wujud kepada rand() API.

Isu asas dengan rand() tertumpu pada:

  1. Keserasian ke belakang: Menukar pelaksanaan sedia ada akan memecahkan kebolehulangan dalam program yang bergantung pada srand dengan benih tetap.
  2. Antara muka ringkas: rand() menyediakan penjana global tunggal. Walaupun sesuai untuk kes penggunaan asas, ia menimbulkan cabaran dalam aplikasi berbilang benang dan senario yang memerlukan jujukan boleh dihasilkan semula.

Baharu perpustakaan menangani kebimbangan ini dengan menawarkan:

  • Pelaksanaan yang ditentukan: Output boleh dihasilkan semula pengkompil silang dan ciri-ciri terjamin.
  • Teknologi terkini penjana: Dikapsulkan dalam kelas untuk mengelakkan keadaan global isu.
  • Peranti rawak: Kemudahan pembenihan.

Dari segi prestasi, std::mt19937 (digunakan oleh std::rand() dalam ujian anda) adalah lebih perlahan daripada std::minstd_rand (LCG juga tersedia dalam perpustakaan ). Menggunakan std::minstd_rand dengan pelaksanaan yang serupa dengan getRandNum_Old() boleh mencapai pelaksanaan yang lebih pantas (6 ms berbanding 8.61 ms untuk rand()).

Atas ialah kandungan terperinci Mengapakah perpustakaan `` dalam C lebih disukai daripada `rand()`?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!