Sinh số ngẫu nhiên trong C/C++, Sinh số random trong đoạn [a,b]

Làm sao để sinh số ngẫu nhiên trong C/C++? Hãy cùng Nguyễn Văn Hiếu Blog đi tìm cách để khởi tạo các số ngẫu nhiên sử dụng C/C++ nhé. Mình sẽ hướng dẫn các bạn khởi tạo các số ngẫu nhiên. Không chỉ sinh số nguyên ngẫu nhiên, mình sẽ hướng dẫn sinh số ngẫu nhiên trong đoạn min, max] và cả cách để sinh số thực nữa. Các bạn cùng tìm hiểu với mình nhé.

1. Cách sinh số nguyên ngẫu nhiên

Để sinh số nguyên trong lập trình C/C++. Chúng ta có thể sử dụng hàm rand(). Hàm này trả về một số nguyên có kiểu dữ liệu là int

Ví dụ:

Mình xin 5 phút quảng cáo nha =))

Kết quả chạy thử:

Tuy nhiên, hàm rand() này sẽ không hề random ra các số mới khi bạn chạy code ở các lần sau. Nghĩa là, kết quả của code trên ở mọi lần chạy sẽ đều random ra 5 số giống nhau. Bạn có thể thử chạy đoạn code trên nhiều lần để kiếm chứng.

Vậy làm sao để random các số ngẫu nhiên tại mọi thời điểm? Hãy đọc phần tiếp theo nào.

2. Sinh số ngẫu nhiên trong C/C++ với srand()

Để tạo ra các số ngẫu nhiên khác nhau tại mọi thời điểm chạy code, chúng ta sẽ thêm hàm srand() và truyền vào một tham số seed kiểu int. Tham số này thay đổi thì hàm srand() sẽ sinh ra các số khác nhau.

Ví dụ:

Trong trường hợp này, giá trị a vẫn sẽ không đổi ở các lần chạy do 123456 là một hằng số. Vậy, chúng ta sẽ cần truyền vào một giá trị động chứ không phải giá trị tĩnh 😀

Có một giải pháp tốt nhất là chúng ta sẽ truyền cho seed thời gian hiện tại. Bằng cách sử dụng hàm time() trong thư viện time.h. Hàm time() trả về kiểu time_t nhưng chúng ta có thể convert về int.

Bằng cách thêm hàm này trước khi gọi hàm rand(), chúng ta đã có thể sinh số ngẫu nhiên khác nhau.

Một ví dụ cụ thể:

Kết quả chạy thử:

Ok, đã giải quyết được bài toán sinh số ngẫu nhiên cơ bản. Nhưng nếu tôi muốn sinh số ngẫu nhiên trong đoạn [min, max] thì phải làm thế nào?

3. Sinh số ngẫu nhiên trong đoạn [min, max]

Có thể các bạn thừa biết, phép toán chia dư (%) của mọi số bất kỳ(a) cho một số b cố định: a % b sẽ cho ra giá trị thuộc đoạn [0, b-1]. Ta sẽ lợi dụng tính chất này để sinh số ngẫu nhiên trong đoạn [minN, maxN] như sau:

Như vậy, nếu bạn muốn sinh số ngẫu nhiên trong C++ trong đoạn [5,10], bạn làm như sau:

Dưới đây là một ví dụ cụ thể, tôi sẽ viết hàm random thành 1 hàm con để các bạn có thể tiện sử dụng.

Kết quả chạy thử:

Kết quả sinh số ngẫu nhiên trong đoạn [minN, maxN]
Kết quả sinh số ngẫu nhiên trong đoạn [minN, maxN]

4. Sinh số thực ngẫu nhiên trong đoạn [min, max]

Dưới đây là hàm giúp các bạn sinh số thực ngẫu nhiên trong đoạn [min, max].

Về cơ bản ý tưởng vẫn sử dụng hàm rand. Sau đó chia cho RAND_MAX để được số thực. Vì RAND_MAX là số lớn nhất mà hàm rand(), nên kết quả thu được sẽ là số thực trong đoạn [0, 1]. Chúng ta cần xử lý thêm một chút để thu được giá trị trong đoạn [min, max].

5. Sinh số ngẫu nhiên kiểu long long

Trong một số trường hợp, bạn có thể sẽ cần random số ngẫu nhiên lớn hơn kiểu int. Khi đó, bạn có thể sử dụng hàm random kiểu long long int này. Dưới đây là code các bạn tham khảo:

Kết luận

Bài viết này Nguyễn Văn Hiếu Blog đã hướng dẫn bạn khá đầy đủ về cách để sinh số ngẫu nhiên trong C/C++. Hi vọng bài viết đem lại nhiều kiến thức bổ ích cho tất cả các bạn.

Nếu bạn đọc quan tâm nhiều hơn về đề tài này, hãy tiếp tục đọc các bài viết có tag là sinh số ngẫu nhiên nhé. Mình sẽ còn hướng dẫn các bạn xáo trộn mảng, hay sinh một mảng các số không trùng lặp,…

Hẹn gặp lại các bạn ở các bài viết tiếp theo!

avatar
3 Comment threads
2 Thread replies
3 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
hieu.nd3Nguyễn Văn HiếuĐạt NguyễnĐạt Nguyễn Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Đạt Nguyễn
Guest
Đạt Nguyễn

Hình như công thức tìm số trong khoảng [min,max] là n = rand()%(max+1-min)+min á ad

Đạt Nguyễn
Member
Đạt Nguyễn

ai chỉ em với em vẫn không hiểu thuật toán trong đoạn min max với a%b trả về giá trị trong đoạn [0,b-1], em nghĩ là a%b sẽ cho ra kết quả là số dư của phép chia chứ

hieu.nd3
Guest
hieu.nd3

Bạn có thể giải thích hàm sinh kiểu long long ko ạ