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 ạ?

Chế Vũ Gia Hy viết 22:44 ngày 30/09/2018

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.

Nguyen Thanh Chinh viết 22:38 ngày 30/09/2018

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

Chế Vũ Gia Hy viết 22:37 ngày 30/09/2018

Cái này bạn phải hiểu rõ thuật toán của rand() rồi . Nhiệm vụ của srand(x) là đưa ra một seed x ban đầu, rồi sau đó rand() sẽ dựa vào x ra một số a, và a sẽ là seed cho lần gọi rand() tiếp theo. Cứ như thế tiếp tục. Đó là cách rand() cho ra số random. Do trong vòng lặp, trong thời gian 1s rand() 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à

en.wikipedia.org

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...

Nguyen Thanh Chinh viết 22:40 ngày 30/09/2018

Okie, cám ơn anh, e đã hiểu

Bài liên quan
0