Rumah >pembangunan bahagian belakang >C++ >Bagaimana Menjana Nombor Benar-Benar Rawak dalam C : Adakah `rand()` Cukup?
Cara Menjana Nombor Benar-Benar Rawak dalam C
Apabila membangunkan aplikasi yang memerlukan penjanaan nombor rawak, seperti dalam permainan membaling dadu , adalah penting untuk memastikan bahawa nombor yang dihasilkan benar-benar rawak dan tidak berat sebelah terhadap nilai tertentu.
Kod coretan yang dibentangkan dalam soalan menggunakan fungsi rand() untuk menjana nombor rawak dalam julat tertentu. Walau bagaimanapun, seperti yang diperhatikan dalam output, nombor yang sama dijana berulang kali, menunjukkan kekurangan rawak.
Isu:
Isu timbul daripada penggunaan modulo operator (%) untuk memetakan nombor rawak kepada julat tertentu. Walaupun pendekatan ini kelihatan mudah, ia boleh memperkenalkan berat sebelah bergantung pada pelaksanaan penjana nombor rawak.
Penyelesaian:
Untuk menangani isu ini dan menjana nombor rawak dalam C , adalah disyorkan untuk menggunakan ciri yang diperkenalkan dalam C 11. Kod berikut menunjukkan pendekatan alternatif:
#include <random> #include <iostream> int main() { std::random_device dev; std::mt19937 rng(dev()); std::uniform_int_distribution<std::mt19937::result_type> dist6(1, 6); // distribution in range [1, 6] std::cout << dist6(rng) << std::endl; }
Dalam kod ini, kelas std::random_device menyediakan sumber entropi untuk memulakan penjana nombor rawak Mersenne Twister (std::mt19937). Kelas std::uniform_int_distribution mencipta objek pengedaran dalam julat yang dikehendaki ([1, 6] dalam kes ini).
Apabila memanggil dist6(rng), integer benar-benar rawak dalam julat yang ditentukan dijana. Dengan menerima ciri C 11 ini, pembangun boleh mencapai lebih rawak dan mengelakkan hasil yang berat sebelah dalam aplikasi mereka.
Atas ialah kandungan terperinci Bagaimana Menjana Nombor Benar-Benar Rawak dalam C : Adakah `rand()` Cukup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!