Rumah > pembangunan bahagian belakang > C++ > Bagaimana Menjana Nombor Benar-Benar Rawak dalam C : Adakah `rand()` Cukup?

Bagaimana Menjana Nombor Benar-Benar Rawak dalam C : Adakah `rand()` Cukup?

Patricia Arquette
Lepaskan: 2024-12-24 00:21:20
asal
345 orang telah melayarinya

How to Generate Truly Random Numbers in C  :  Is `rand()` Enough?

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;
}
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan