Cách Sinh Số Ngẫu Nhiên Trong C++ – Random Number Library ...

random

Việc phát sinh số ngẫu nhiên là cần thiết khi chúng ta cần test 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 <cstdlib>). Bài viết này sẽ giúp chúng ta hiểu hơn 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ãy [0, RAND_MAX], với RAND_MAX là một hằng số được định nghĩa trước. Hãy xem ví dụ bên dưới:

// First example #include <iostream> #include <cstdlib> 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; }

– Output là:

image

– Nhưng sau khi chạy nhiều lần chương trình trên, bạn vẫn nhận được một output như lúc đầu. Vấn đề này sẽ được giải quyết trong mục 2.

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

– Để tạo một số ngẫu nhiêu sau thay đổi khác nhau trong những lần chạy, bạn sử dụng hàm time (có trong #include<ctime>). Theo như thư viện MSDN (Microsoft Developers Network) nói rằng: time trả về số của giây được trôi qua được tính từ nữa đêm (00:00:00), ngày 1, tháng 1, năm 1970 theo UTC . (“The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time (UTC), according to the system clock”).

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

srand(time(0));

– Giá trị được trả về từ time là qua srand. Lưu ý rằng số ngẫu nhiên được tạo ra trước lời gọi rand.

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

// Second example #include <iostream> #include <cstdlib> #include <ctime> 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; }

– Output lần đầu:

image

– Output lần 2:

image– Output lần 3:

image

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

– Thông thường, một số ngẫu nhiên nằm trong dãy [0, RAND_MAX] không được mô tả. Đúng hơn là chúng ta không thích một dãy được xác định. Một số ngẫu nhiên trong dãy [0, n – 1] có thể được xác định bằng cách sử dụng toán tử % (modulus). Ví dụ như sinh ra một số ngẫu nhiên trong dãy [0, 21], thì 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 mạch lạc hơn là:

int num = rand() % 22;

– Khi chúng ta cần một dãy không bắt đầu từ 0. Ví dụ như sinh một số ngẫu nhiên nằm trong dãy [22, 100] thì phải làm sao? Chúng ta có thể thực hiện một cách khá đơn giản theo công thức

Để tạo một số ngẫu nhiên trong dãy [a, b] ta sử dụng công thức:

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

Như muốn sinh một số ngẫu nhiên từ dãy [22, 100] ta viết như sau:

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

hay đúng hơn là:

int num = 22 + rand() % (79);

– Do phần tạo số ngẫu nhiên trong dãy [a, b] một số bạn comment vẫn chưa làm được hoặc kết quả cho ra chưa như ý muốn. Cho nên sau đây tôi xin bổ sung một đoạn chương trình minh họa cho việc sinh số ngẫu nhiêu trong đoạn [22, 100].

#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0)); int number[200]; for(int i = 1; i <= 200; i++) { number[i] = 1 + rand()%(100-22+1); /* hoac co the viet: number[i] = 1 + rand()%(79); */ } for(int i = 1; i <= 200; i++) { cout<<number[i]<<" "; if(i%20 == 0) cout<<"\n\n"; } cout<<"\n"; system("pause"); return 0; }

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

SNAGHTML2f4318

kết quả lần chạy thứ 2:

SNAGHTML31db70

Sở dĩ 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à do chương trình của chưa sử dụng hàm srand(time(0)); để sinh ra số ngẫu nhiên trong mỗi lần chạy chương trình, hoặc có thể tập ngẫu nhiên bạn muốn sinh ra chưa đủ lớn nên xác suất có mặt các số mà bạn mong muốn nhỏ hơn (trong ví dụ trên mình sinh ra tập 200 số ngẫu nhiên trong đoạn [22, 100] nên xác suất có mặt của số 100 sẽ cao hơn Island with a palm tree).

** 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)

10.869661 106.803673

Rate this:

Chia sẽ bài viết này cho bạn bè

  • Share
  • Facebook
  • Email
  • X
  • Print
Like Loading...

Related

Từ khóa » Hàm Chọn Số Ngẫu Nhiên Trong C++