30/09/2018, 16:27

Một câu hỏi về hàm rand()?

Hì, mình có 1 thắc mắc về hàm rand() 1 chút! Mình có lập 1 mảng số nguyên dùng hàm rand(), nhưng tại sao mỗi lần chạy chương trình thì nó chỉ cho 1 dãy số duy nhất . Bạn nào có thể giải thích giúp mình tại sao và làm cách nào để nó mỗi lần F9 thì mỗi lần tạo ra dãy ngẫu nhiên mới được hok… Thank trước

TTmagic viết 18:32 ngày 30/09/2018

tham khảo link này nha bạn

Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây : Thông tin về khóa học xem tại đây : -Sự khác biệt giữa 2 khóa học cũ và mới : +Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả. +Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại..... Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học …

#include <time.h>

srand(time(0));
Nguyễn Minh Dũng viết 18:29 ngày 30/09/2018

Mình có lập 1 mảng số nguyên dùng hàm rand(), nhưng tại sao mỗi lần chạy chương trình thì nó chỉ cho 1 dãy số duy nhất

À, vì cái hàm rand nó nhận vào một tham số gọi là seed (gọi là nhân hoặc hạt) từ hàm srand dùng để làm nhân cho cái hàm rand này. Khi @Programmer_Riot chạy hàm này mà không có tham số seed thì nó lấy số mặc định từ hàm srand. Số này không đổi dẫn đến kết quả random cũng không đổi. Hình như Đạt có đọc ở đâu số này mặc định là 0.

Đây là một đoạn code dùng hàm time để làm nhân, tức là hàm time này sẽ trả về một số thay đổi theo thời gian. Suy ra hàm srand sẽ có seed mới sau mỗi lần chạy. Vì thế mình sẽ nhận được chuỗi số random.

Đây là một đoạn code ví dụ sử dụng srand với seedtime

/* rand example: guess the number */
#include <stdio.h>      /* printf, scanf, puts, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */

int main ()
{
  int iSecret, iGuess;

  /* initialize random seed: */
  srand (time(NULL));

  /* generate secret number between 1 and 10: */
  iSecret = rand() % 10 + 1;

  do {
    printf ("Guess the number (1 to 10): ");
    scanf ("%d",&iGuess);
    if (iSecret<iGuess) puts ("The secret number is lower");
    else if (iSecret>iGuess) puts ("The secret number is higher");
  } while (iSecret!=iGuess);

  puts ("Congratulations!");
  return 0;
}

P/S: Video ở trên mà @TTmagic chỉ ra cũng nói rất rõ về điều này

Toan Tran viết 18:27 ngày 30/09/2018

Ở phần hàm rand() trong thư viện tham khảo C thì có mục:
Exceptions (C++)
No-throw guarantee: this function never throws exceptions.

Cái mục này nghĩa là gì vậy anh Đạt.

Nguyễn Minh Dũng viết 18:31 ngày 30/09/2018

Phần này nói về khả năng trả về exception. Có nghĩa là thông báo lỗi khi có lỗi, chỉ hỗ trợ trong C++, C không có. Ở đây hàm rand() đảm bảo là sẽ không gửi về exception gì cả. Có nghĩa là người ta không có làm phần này cho hàm rand()

Bài liên quan
0