[C]. Sinh số ngẫu nhiên trong C, rand() và srand()

Admin

Sinh số ngẫu nhiên trong lập trình C là một công việc thường gặp, ví dụ như bạn cần sinh số ngẫu nhiên từ 1 tới 6 cho con xúc xắc trong game tài xỉu. Bài viết này mình sẽ hướng dẫn các bạn cách sử dụng hàm rand() trong thư viện stdlib.h để giải quyết bài toán sinh ngẫu nhiên. 

NỘI DUNG : 

  • Hàm rand() 
  • Hàm srand()

rand

1.Hàm rand() 

Hàm rand() trong C được sử dụng để sinh số ngẫu nhiên 1 số nguyên trong khoảng từ 0 tới RAND_MAX, trong đó RAND_MAX là một hằng số có giá trị là 32767. Giá trị này có thể khác ở một số chuẩn C khác nhau. 

Ví dụ 1 : 

#include "stdio.h"
#include "stdlib.h"

int main(){
    int n = rand();
    printf("So vua duoc sinh ngau nhien : %d", n);
    return 0;
}

Output : 

So vua duoc sinh ngau nhien : 41

Trên máy tính của bạn có thể kết quả sẽ ra khác 0 tời 32766

Ví dụ 2 : Sinh số ngẫu nhiên từ 1 tới N

Cú pháp : rand() % N + 1

Đối với bài toán này bạn vẫn sử dụng hàm rand() nhưng cần chia dư số do hàm rand() trả về với N, vì khi bạn chia dư cho N thì số dư sẽ chạy từ 0 tới N - 1, bạn cộng thêm 1 vào số dư sẽ có thể sinh được các số từ 1 tới N

#include "stdio.h"
#include "stdlib.h"

int main(){
    int n = 28;
    for(int i = 1; i <= 5; i++){
        int number = rand() % 28 + 1;
        printf("Sinh ngau nhien lan %d : %d\n", i, number);
    }
    return 0;
}

Output : 

Sinh ngau nhien lan 1 : 14
Sinh ngau nhien lan 2 : 16
Sinh ngau nhien lan 3 : 7
Sinh ngau nhien lan 4 : 13
Sinh ngau nhien lan 5 : 18

Ví dụ 3 : Sinh số ngẫu nhiên từ a đến b 

Cú pháp : rand() % (b - a + 1) + a

#include "stdio.h"
#include "stdlib.h"

int main(){
    int a = 100, b = 120;
    for(int i = 1; i <= 5; i++){
        int number = rand() % (b - a + 1) + a;
        printf("Sinh ngau nhien lan %d : %d\n", i, number);
    }
    return 0;
}

Output : 

Sinh ngau nhien lan 1 : 120
Sinh ngau nhien lan 2 : 108
Sinh ngau nhien lan 3 : 113
Sinh ngau nhien lan 4 : 119
Sinh ngau nhien lan 5 : 117

Ví dụ 4 : Sinh số ngẫu nhiên từ -a tới a

Cú pháp : rand() % (2a + 1) - a

Ví dụ khi a = 5, bạn cần sinh ra các số 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 và trừ đi a khi đó các giá trị ngẫu nhiên thu được sẽ chạy từ -5 tới 5

Code : 

#include "stdio.h"
#include "stdlib.h"

int main(){
    int a = 5;
    for(int i = 1; i <= 6; i++){
        int number = rand() % (2 * a + 1) - a;
        printf("Sinh ngau nhien lan %d : %d\n", i, number);
    }
    return 0;
}

Output : 

Sinh ngau nhien lan 1 : 3
Sinh ngau nhien lan 2 : 4
Sinh ngau nhien lan 3 : 4
Sinh ngau nhien lan 4 : -4
Sinh ngau nhien lan 5 : 2
Sinh ngau nhien lan 6 : 0

2. Hàm srand()

Hàm srand() trong C được sử dụng để tạo seed - tạm dịch là hạt giống cho việc sinh ngẫu nhiên. Trong các ví dụ ở trên nếu bạn chạy chương trình của mình nhiều lần thì kết quả sinh ngẫu nhiên ở các lần sẽ giống nhau. 

Để tránh trường hợp này thì bạn nên sử dụng thêm hàm srand() để tạo seed cho hàm rand() trước khi sinh ngẫu nhiên

Cú pháp : 

void srand (unsigned int seed);

Nếu tham số seed của srand() là 1 thì tương tự như việc bạn không sử dụng srand() trước hàm rand() như các ví dụ ở phần 1

Thông thường thì tham số seed này được lựa chọn dựa vào thời gian thông qua hàm time() trong thư viện time.h

Hàm time() với tham số con trỏ NULL trả về số giây tính từ 00:00 ngày 01/01/1970 tới thời gian hiện tại

Code : 

#include "stdio.h"
#include "stdlib.h"
#include "time.h"

int main(){
    int a = 28;
    srand(time(NULL));
    for(int i = 1; i <= 6; i++){
        int number = rand() % 28;
        printf("Sinh ngau nhien lan %d : %d\n", i, number);
    }
    return 0;
}

Output : 

Sinh ngau nhien lan 1 : 3
Sinh ngau nhien lan 2 : 9
Sinh ngau nhien lan 3 : 0
Sinh ngau nhien lan 4 : 21
Sinh ngau nhien lan 5 : 19
Sinh ngau nhien lan 6 : 22

Sau khi sử dụng srand() trước khi sử dụng rand() thì mỗi lần chương trình bạn chạy sẽ sinh ra kết quả ngẫu nhiên khác nhau. Điều này là do mỗi lần chạy bạn đều sử dụng một seed khác nhau cho việc sinh số ngẫu nhiên.