Misteri rand() % 14 Hanya Menghasilkan 6 atau 13
Seorang pengaturcara telah menghadapi isu pelik di mana rand() % 14 secara konsisten mengembalikan hanya 6 atau 13 dalam program C mereka. Walaupun menjalankan program beberapa kali, nilai ini adalah hasil eksklusif.
Kod yang dipersoalkan:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main(int argc, const char * argv[]) { srand(time(NULL)); cout << rand() % 14; return 0; }
Pelakunya: Penjana nombor rawak MCG Apple
Seperti Wikipedia, pengganda yang digunakan oleh penjana nombor rawak (RNG) Marsaglia-Crépeau Apple ialah 16807. Malangnya, pengganda ini boleh dibahagikan dengan 7. Akibatnya, nombor rawak awal yang dijana selepas srand() hanya mempunyai satu bit modulo entropi 14, mengehadkannya kepada dua nilai yang mungkin: 6 atau 13.
Penyelesaian mudah
Untuk mengelakkan isu ini, seseorang boleh buang beberapa nombor rawak yang dijana sejurus selepas srand(). Dengan melakukan ini, entropi nombor rawak seterusnya meningkat, membenarkan julat nilai yang lebih luas.
Berikut ialah kod yang diubah suai:
int main(int argc, const char * argv[]) { srand(time(NULL)); // Discard the first few random numbers to eliminate the bias for (int i = 0; i < 10; ++i) rand(); cout << rand() % 14; return 0; }
Dengan membuang 10 nombor rawak pertama, anda dengan berkesan menghapuskan berat sebelah yang diperkenalkan oleh pengganda cacat MCG RNG.
Atas ialah kandungan terperinci Mengapakah `rand() % 14` Hanya Mengembalikan 6 atau 13 pada Sistem Apple?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!