Rumah >pembangunan bahagian belakang >C++ >Mengapa Nombor Rawak Berulang dalam Lelaran Gelung?

Mengapa Nombor Rawak Berulang dalam Lelaran Gelung?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 01:00:02876semak imbas

Why are Random Numbers Repeating in Loop Iterations?

Ulangan Nombor Rawak dalam Lelaran Gelung

Pertimbangkan isu berikut: dalam gelung yang menjalankan 15 lelaran, kaedah dh.setDoors() dipanggil. Dalam setDoors(), srand(time(0)) digunakan untuk menetapkan benih untuk penjanaan nombor rawak. Selepas itu, nombor rawak dijana menggunakan ungkapan seperti carSetter = rand()%3 1 atau decider = rand()%2 1.

Memantau nilai carSetter dan decider mendedahkan bahawa ia kekal malar sepanjang setiap lelaran gelung , tetapi tukar antara larian gelung yang berbeza. Tingkah laku ini tidak dijangka kerana gelung melibatkan 15 lelaran bebas, menunjukkan bahawa setiap nilai rawak harus berbeza-beza.

Menyiasat Punca

Isu timbul daripada penempatan srand( masa(0)) pada permulaan setiap lelaran. Dengan menetapkan semula benih dengan setiap gelung, urutan nombor rawak pseudo ditetapkan dengan berkesan oleh nilai malar masa(0) dalam lelaran. Memandangkan masa(0) kekal sama sepanjang gelung, jujukan nombor rawak yang sama dijana.

Menyelesaikan Isu

Untuk menangani masalah ini, adalah disyorkan untuk mulakan penjana nombor rawak sekali sahaja, pada permulaan program dan bukannya dalam setiap lelaran gelung. Ini memastikan bahawa urutan nombor rawak yang berbeza digunakan untuk setiap lelaran gelung.

Pelaksanaan yang disemak akan menyerupai yang berikut:

srand(time(0));  // Call srand() once at the start of the program

while (...) {
    x = rand();
    y = rand();
}

Dengan pengubahsuaian ini, nilai x dan y akan berbeza antara lelaran gelung, menghasilkan gelagat yang diingini bagi jujukan nombor rawak yang berbeza.

Atas ialah kandungan terperinci Mengapa Nombor Rawak Berulang dalam Lelaran Gelung?. 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