Xem thêm

Cách sinh số ngẫu nhiên trong C++ - Thư viện hàm số ngẫu nhiên | Để một cuộc sống tốt hơn!

Huy Erick
Việc phát sinh số ngẫu nhiên là rất quan trọng khi chúng ta cần kiểm tra chương trình. Việc tạo số ngẫu nhiên trong C++ cũng khá đơn giản. Thư viện chuẩn của C++ cung...

random

Việc phát sinh số ngẫu nhiên là rất quan trọng khi chúng ta cần kiểm tra chương trình. Việc tạo số ngẫu nhiên trong C++ cũng khá đơn giản. Thư viện chuẩn của C++ cung cấp một hàm gọi là rand (#include ). Trong bài viết này, chúng ta sẽ tìm hiểu thêm về chức năng tạo số ngẫu nhiên trong C++.

1. Tạo một số ngẫu nhiên:

Hàm rand() trả về một số nguyên nằm trong dải [0, RAND_MAX], với RAND_MAX là một hằng số được định nghĩa trước. Dưới đây là một ví dụ minh họa:

#include 
#include 
using namespace std;

int main() {
  int r0 = rand();
  int r1 = rand();
  int r2 = rand();
  int r3 = rand();
  int r4 = rand();

  cout << "r0 = " << r0 << endl;
  cout << "r1 = " << r1 << endl;
  cout << "r2 = " << r2 << endl;
  cout << "r3 = " << r3 << endl;
  cout << "r4 = " << r4 << endl;

  system("pause");
  return 0;
}
  • Đầu ra là: image

  • Tuy nhiên, sau nhiều lần chạy chương trình, bạn vẫn nhận được kết quả giống nhau. Vấn đề này sẽ được giải quyết trong phần tiếp theo.

2. Tạo một số ngẫu nhiên thay đổi theo thời gian

  • Để tạo ra các số ngẫu nhiên khác nhau mỗi lần chạy, bạn có thể sử dụng hàm time (có trong #include ). Theo tài liệu của MSDN, hàm time trả về số giây đã trôi qua tính từ nửa đêm (00:00:00), ngày 1 tháng 1 năm 1970 theo UTC (giờ thống nhất toàn cầu).

  • Các số ngẫu nhiên hữu giới hạn được tạo ra bắt đầu từ thời điểm mà bạn thiết lập bằng cách sử dụng hàm srand. Đoạn code dưới đây thiết lập thời điểm bắt đầu của thời gian hiện tại:

srand(time(0));
  • Giá trị được trả về từ time được sử dụng trong hàm srand. Lưu ý rằng các số ngẫu nhiên được tạo ra trước lời gọi rand.

Ví dụ với chương trình trước: chúng ta thêm srand(time(0)) trước lời gọi rand().

#include 
#include 
#include 
using namespace std;

int main() {
  srand(time(0));
  int r0 = rand();
  int r1 = rand();
  int r2 = rand();
  int r3 = rand();
  int r4 = rand();

  cout << "r0 = " << r0 << endl;
  cout << "r1 = " << r1 << endl;
  cout << "r2 = " << r2 << endl;
  cout << "r3 = " << r3 << endl;
  cout << "r4 = " << r4 << endl;

  system("pause");
  return 0;
}
  • Đầu ra lần chạy đầu tiên: image

  • Đầu ra lần chạy thứ hai: image

  • Đầu ra lần chạy thứ ba: image

3. Tạo số ngẫu nhiên trong dải xác định (Specifying the range)

  • Thông thường, một số ngẫu nhiên trong dải [0, RAND_MAX] không được mô tả cụ thể. Thực tế hơn là chúng ta không muốn một dải giá trị cụ thể. Một số ngẫu nhiên trong dải [0, n - 1] có thể được xác định bằng cách sử dụng toán tử % (modulus). Ví dụ, để tạo ra một số ngẫu nhiên trong dải [0, 21], bạn có thể viết như sau:
int num = rand();
int val = num % 22;
  • Hoặc có thể viết một cách ngắn gọn hơn là:

    int num = rand() % 22;
  • Khi chúng ta cần một dải không bắt đầu từ 0, ví dụ như tạo một số ngẫu nhiên trong dải [22, 100], chúng ta có thể sử dụng công thức sau:

    a + rand() % (b - a + 1)

Với ví dụ trên, ta có thể viết như sau:

int num = 22 + rand() % (100 - 22 + 1);

Hoặc:

int num = 22 + rand() % 79;
  • Nếu bạn vẫn gặp khó khăn trong việc tạo số ngẫu nhiên trong một dải [a, b], hoặc kết quả không như mong muốn, sau đây tôi sẽ cung cấp một đoạn chương trình minh họa cho việc tạo số ngẫu nhiên trong đoạn [22, 100].
#include 
#include 
#include 
using namespace std;

int main() {
  srand(time(0));
  int number[200];
  for(int i = 1; i <= 200; i++) {
    number[i] = 22 + rand() % (100 - 22 + 1);
    /* hoặc có thể viết: number[i] = 1 + rand()%(79); */
  }
  for(int i = 1; i <= 200; i++) {
    cout << number[i] << " ";
    if(i%20 == 0) cout << "nn";
  }
  cout << "n";
  system("pause");
  return 0;
}

Kết quả khi chạy chương trình lần 1: SNAGHTML2f4318

Kết quả khi chạy chương trình lần 2: SNAGHTML31db70

Lý do các chương trình của nhiều bạn không thể cho ra kết quả có số 100 (như bạn [email protected] đã comment dưới bài viết này) là vì chương trình chưa sử dụng hàm srand(time(0)) để tạo ra số ngẫu nhiên trong mỗi lần chạy chương trình, hoặc có thể số lượng ngẫu nhiên bạn mong muốn sinh ra chưa đủ lớn, do đó, xác suất xuất hiện các số mong muốn sẽ nhỏ hơn (trong ví dụ trên, chúng ta tạo ra tập 200 số ngẫu nhiên trong dải [22, 100], do đó xác suất xuất hiện số 100 cao hơn).

Lưu ý: Các ví dụ đã được chạy thử trên môi trường DevC++. (Tham khảo Frank Luna, C++ Programming for Games - Module I)

1