30/09/2018, 20:33
Hỏi về hàm srand(time(NULL));
Chào mọi người, em đang cần sử dụng các hàm random để tạo ra các bộ input, output thì phát hiện có vấn đề, nếu để code theo thứ tự:
for(i=0;i<9999;i++) {
srand(time(NULL));
arr[i]=rand()%15000;
fprintf(f,"%d
",arr[i]);
}
thì các số in ra giống hệt nhau
Còn nếu để:
srand(time(NULL));
for(i=0;i<9999;i++) {
arr[i]=rand()%15000;
fprintf(f,"%d
",arr[i]);
}
Thì các số lại khác nhau theo đúng nghĩa random, Vậy em muốn hỏi nguyên nhân là do đâu ạ?
Bài liên quan
Bởi vì mỗi lần lặp lại như vậy srand(time(NULL)) của bạn đều cho ra 1 seed giống nhau, do 9999 vòng lặp của bạn chạy ít hơn hơn 1 giây :). Để kiểm tra bạn có thể cho vòng lặp chạy khoảng 1 000 000 000 xem, sẽ có kết qủa khác nhau. Trong mỗi chương trình bạn chỉ cần cho seed một lần duy nhất ở đầu mỗi chương trình, còn lại là dùng rand() thoải mái.
Vậy nếu em để srand bên ngoài thì seed nó thay đổi như nào, anh giải thích hộ em được ko
Cái này bạn phải hiểu rõ thuật toán của
en.wikipedia.org
rand()
rồi . Nhiệm vụ củasrand(x)
là đưa ra một seed x ban đầu, rồi sau đórand()
sẽ dựa vàox
ra một sốa
, vàa
sẽ là seed cho lần gọirand()
tiếp theo. Cứ như thế tiếp tục. Đó là cáchrand()
cho ra số random. Do trong vòng lặp, trong thời gian 1srand()
phải dùng seed cũx
liên tục nên nó không bao giờ ra số khác nhau trong khoảng thời gian đó.Bạn có thể đọc thêm thuật toán mà
rand()
dùng làPseudorandom number generator
A pseudorandom number generator (PRNG), also known as a deterministic random bit generator (DRBG), is an algorithm for generating a sequence of numbers whose properties approximate the properties of sequences of random numbers. The PRNG-generated sequence is not truly random, because it is completely determined by an initial value, called the PRNG's seed (which may include truly random values). Although sequences that are closer to truly random can be generated using hardware random number ge PR...
Okie, cám ơn anh, e đã hiểu