Hàm rand trong c | Laptrinhcanban.com

HOME › >>

Hàm rand trong c

Hướng dẫn cách sử dụng hàm rand trong c. Hàm rand trong c có chức năng tương tự như hàm random trong các ngôn ngữ lập trình khác, và bạn sẽ học được cách sử dụng hàm rand để tạo ra một số ngẫu nhiên trong C sau bài học này.

Hàm rand trong c

Hàm rand trong c là một hàm có sẵn trong header file stdlib.h, giúp chúng ta tạo ra một số ngẫu nhiên trong phạm vi từ 0 đến RAND_MAX. Giá trị RAND_MAX sẽ phụ thuộc vào môi trường lập trình C, ví dụ như trong VisualStudio thì giá trị này sẽ là 0x7fff, tương ứng với số thập phân là 2147483647.

Hàm rand trong c có chức năng tương tự như hàm random trong một số ngôn ngữ lập trình khác. Trong C thì hàm rand không có đối số, và chúng ta sử dụng hàm rand để tạo ra một số ngẫu nhiên với cú pháp sau đây:

rand();

Lưu ý là chúng ta cần include header file stdlib.h để có thể sử dụng được hàm rand trong chương trình.

Ví dụ cụ thể, chúng ta sử dụng hàm rand trong c để tạo ra 10 số ngẫu nhiên như sau:

#include <stdio.h>
#include <stdlib.h>

int main(void){

for (int i = 0;i < 10;i++) {
printf("%d\n",rand());
}

return 0;
}

Kết quả chương trình trên máy của Kiyoshi.

1804289383
846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421

Lưu ý là kết quả này sẽ khác nhau nếu chạy trên máy của các bạn nhé.

Chỉ định phạm vi khi tạo số ngẫu nhiên bằng hàm rand trong c

Hàm rand trong C theo mặc định sẽ xuất một số ngẫu nhiên trong phạm vi từ 0 đến RAND_MAX. Tuy nhiên thì chúng ta cũng hoàn toàn có thể chỉ định được phạm vi của số được tạo ra ngẫu nhiên này.

Và dưới đây là công thức để chỉ định phạm vi tạo số ngẫu nhiên bằng hàm rand trong c:

min + (int)( rand() * (max - min + 1.0) / (1.0 + RAND_MAX) );

Trong đó min là phạm vi số nhỏ nhất, và max là phạm vi số lớn nhất mà bạn muốn tạo ra số ngẫu nhiên. Mặc dù cách viết trên khá là khó hiểu, nhưng bạn chỉ cần thay thế hai giá trị max và min vào công thức trên là được.

Chúng ta cũng có thể tạo ra một hàm random trong c sử dụng công thức này để sử dụng khi cần như sau:

#include <stdlib.h>
int GetRandom(int min,int max){
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

Và chúng ta sử dụng hàm này trong chương trình như sau. Ví dụ chương trình dưới đây sẽ tạo ra các số ngẫu nhiên trong phạm vi từ 1 đến 10:

#include <stdio.h>
#include <stdlib.h>

int GetRandom(int min,int max){
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

int main(void){
int min = 1, max = 10;

for (int i = 0;i < 10;i++) {
printf("%d\n",GetRandom(1,10));
}

return 0;
}

Kết quả:

9
4
8
8
10
2
4
8
3
6

Nhược điểm của hàm rand trong c

Hàm rand trong c có tác dụng tạo ra một số ngẫu nhiên, tuy nhiên hàm rand cũng có một nhược điểm đó là, các số ngẫu nhiên được tạo ra trong các lần chạy hàm đều là giống nhau.

Thật vậy, với chương trình tạo ra 10 số ngẫu nhiên như trên, thì dẫu bạn chạy đi chạy lại chương trình tới 100 lần trên cùng một môi trường lập trình, thì kết quả cũng sẽ là chỉ một mà thôi.

Kết quả lần 1:

9
4
8
8
10
2
4
8
3
6

Kết quả lần 2:

9
4
8
8
10
2
4
8
3
6

Tại sao lại xảy ra chuyện này? Lý do là bởi vì số ban đầu được sử dụng để tính các số ngẫu nhiên trong mỗi môi trường lập trình C là giống nhau. Bởi vậy, do cùng được sinh từ một số ban đầu, nên kết quả là các lần chạy hàm đều tạo ra các số ngẫu nhiên lại hoàn toàn giống nhau.

Tạo số ngẫu nhiên khác nhau mỗi lần chạy hàm rand trong C

Để có thể khắc phục nhược điểm của hàm rand và tạo số ngẫu nhiên khác nhau mỗi lần chạy hàm, chúng ta cần phải thay đổi số ban đầu được sử dụng để sinh ra các số ngẫu nhiên.

Để thay đổi số ban đầu sử dụng trong hàm rand, chúng ta sẽ cần dùng hàm srand trong C với cú pháp tổng quát sau đây:

srand(num);

Trong đó num chính là số ban đầu được sử dụng để tạo ra các số ngẫu nhiên trong các môi trường lập trình C.

Tuy nhiên mọi chuyện chưa dừng lại ở đây. Trong mỗi thời gian nhất định, số num này lại có giá trị giống nhau. Điều đó có nghĩa, nếu trong cùng 1 thời gian chạy hàm, thì các số ngẫu nhiên được tạo ra vẫn là giống nhau.

Để giải quyết vấn đề này, chúng ta cần phải tạo ra số num hoàn toàn khác nhau trong mỗi lần chạy hàm srand trong c. Và ý tưởng ở đây đó chính là đưa khái niệm thời gian vào hàm srand, nếu chúng ta chỉ định thời khắc hiện tại tính theo giây (s) làm đối số của hàm srand(), thì trong mỗi lần chạy hàm srand, thời khắc tính theo giây đều khác nhau, dẫn đến giá trị của num cũng khác nhau.

Để sinh ra thời khắc hiện tại, chúng ta sẽ dùng tời hàm time, và chúng ta sẽ sử dụng hàm rand kết hợp hàm time với cú pháp sau đây:

srand((unsigned int)time(NULL));

Lưu ý chúng ta cần include header file time.h để có thể sử dụng được hàm time trong chương trình.

Như vậy, chúng ta đã có thể dùng hàm srand để thay đổi số ban đầu để tạo ra các số ngẫu nhiên trong hàm rand.

Và chúng ta viết chương trình tạo số ngẫu nhiên khác nhau mỗi lần chạy hàm rand trong C như sau:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//Tạo hàm GetRandom để chỉ định phạm vi sinh số ngẫu nhiên
int GetRandom(int min,int max){
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

int main(void){
//Sử dụng hàm srand để thay đổi số nguồn sử dụng trong hàm rand
srand((unsigned int)time(NULL));

for (int i = 0;i < 10;i++) {
printf("%d\n",GetRandom(1,6));
}

return 0;
}

Kết quả chạy lần 1:

3
5
9
9
7
9
10
8
5
3

Kết quả chạy lần 2:

10
1
2
5
6
5
8
5
9
7

Các kết quả trên có thể khác khi bạn chạy trong máy của mình. Tuy nhiên thì với cùng một môi trường lập trình C thì bạn có thể thấy các số ngẫu nhiên được sinh ra đều đã hoàn toàn khác nhau trong mỗi lần chạy hàm rand rồi chứ.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách sử dụng hàm rand trong c rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/ham-trong-c/ham-rand-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.