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!