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\n",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\n",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 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.

2 Likes

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 :smiley:

Cái này bạn phải hiểu rõ thuật toán của rand() rồi :wink:. 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à

7 Likes

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?