Cách tạo số ngẫu nhiên trong C (rand, srand) – Hướng dẫn chi tiết

1. Cách tạo số ngẫu nhiên trong C: Hàm rand()

1.1 Hàm rand() là gì?

Hàm rand() được sử dụng trong ngôn ngữ C để tạo số giả ngẫu nhiên. Số giả ngẫu nhiên là một chuỗi số được tạo ra theo một thuật toán đã định sẵn. Mặc dù không phải là số ngẫu nhiên thực sự, nhưng chúng đủ tốt cho các mục đích sử dụng thông thường. Hàm rand() trả về một số nguyên trong phạm vi từ 0 đến 32767. Phạm vi này có thể khác nhau tùy thuộc vào hệ thống, nhưng đây là giá trị phổ biến nhất.

1.2 Cách sử dụng hàm rand() cơ bản

Để sử dụng hàm rand(), bạn cần include thư viện stdlib.h. Đoạn mã dưới đây là ví dụ cơ bản về cách tạo số ngẫu nhiên bằng hàm rand().

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

int main(void) {
    int randomNumber = rand(); 
    printf("Generated random number: %d
", randomNumber);
    return 0;
}

Khi chạy đoạn mã này, một số ngẫu nhiên trong khoảng từ 0 đến 32767 sẽ được hiển thị. Tuy nhiên, một nhược điểm là mỗi lần chạy sẽ tạo ra cùng một số ngẫu nhiên. Chúng ta sẽ thảo luận về điều này sau.

2. Cách điều chỉnh phạm vi số ngẫu nhiên

2.1 Giới hạn phạm vi bằng toán tử modulo

Khi tạo số ngẫu nhiên, bạn thường cần các giá trị trong một phạm vi cụ thể. Ví dụ, nếu bạn muốn tạo số ngẫu nhiên từ 1 đến 100, bạn có thể sử dụng toán tử modulo % trên đầu ra của hàm rand() để điều chỉnh phạm vi.

int numberInRange = rand() % 100 + 1; // Tạo số ngẫu nhiên từ 1 đến 100

Trong ví dụ này, chúng ta lấy phần dư của kết quả rand() khi chia cho 100, sau đó cộng thêm 1 để tạo số ngẫu nhiên từ 1 đến 100. Việc sử dụng toán tử modulo giúp dễ dàng tạo số ngẫu nhiên trong bất kỳ phạm vi nào.

2.2 Tạo số ngẫu nhiên trong phạm vi tùy chỉnh

Nếu bạn muốn linh hoạt hơn trong việc chỉ định phạm vi số ngẫu nhiên, bạn có thể tạo và sử dụng một hàm riêng. Dưới đây là ví dụ về một hàm tạo số ngẫu nhiên trong phạm vi giữa một giá trị tối thiểu và tối đa bất kỳ:

int getRandomNumber(int min, int max) {
    return rand() % (max - min + 1) + min;
}

Sử dụng hàm này, bạn có thể tạo số ngẫu nhiên trong một phạm vi tùy ý, ví dụ như getRandomNumber(1, 100).

侍エンジニア塾

3. Thay đổi mẫu số ngẫu nhiên bằng hàm srand()

3.1 Hàm srand() là gì?

Nếu bạn chỉ sử dụng hàm rand(), mỗi lần chạy chương trình sẽ tạo ra cùng một mẫu số ngẫu nhiên. Đây là đặc tính của số giả ngẫu nhiên, tiện lợi cho việc debug nhưng lại là vấn đề khi cần số ngẫu nhiên thực tế. Để khắc phục, bạn có thể sử dụng hàm srand() để thiết lập “hạt giống” (seed) cho bộ tạo số ngẫu nhiên, từ đó thay đổi mẫu số ngẫu nhiên được tạo ra.

3.2 Cách sử dụng hàm srand()

Hàm srand() được gọi trước hàm rand() để chỉ định hạt giống cho bộ tạo số ngẫu nhiên. Thông thường, bạn sẽ sử dụng srand((unsigned int)time(NULL)) để sử dụng thời gian hiện tại làm hạt giống.

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

int main(void) {
    srand((unsigned int)time(NULL)); // Đặt thời gian hiện tại làm hạt giống
    int randomNumber = rand(); 
    printf("Generated random number: %d
", randomNumber);
    return 0;
}

Trong đoạn mã này, srand() đảm bảo rằng mỗi lần chạy sẽ tạo ra một mẫu số ngẫu nhiên khác nhau. Hàm time(NULL) trả về thời gian hiện tại theo giây, cho phép đặt một hạt giống khác nhau mỗi lần.

4. Các ứng dụng của số ngẫu nhiên

4.1 Sử dụng số ngẫu nhiên trong game

Số ngẫu nhiên được sử dụng rất nhiều trong phát triển game. Ví dụ, chúng được dùng để đặt vị trí ngẫu nhiên cho nhân vật hoặc quyết định tỷ lệ xuất hiện của vật phẩm. Dưới đây là ví dụ mô phỏng việc tung xúc xắc:

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

int main(void) {
    srand((unsigned int)time(NULL)); // Đặt hạt giống
    int diceRoll = rand() % 6 + 1; // Tạo số ngẫu nhiên từ 1 đến 6
    printf("Dice roll: %d
", diceRoll);
    return 0;
}

Chương trình này tạo ra một số ngẫu nhiên từ 1 đến 6 và in ra như mặt xúc xắc. Bằng cách sử dụng số ngẫu nhiên, bạn có thể dễ dàng triển khai các yếu tố khó đoán trong game.

4.2 Mô phỏng bằng phương pháp Monte Carlo

Số ngẫu nhiên cũng được sử dụng trong các mô phỏng như phương pháp Monte Carlo. Phương pháp Monte Carlo là một kỹ thuật sử dụng số ngẫu nhiên để ước tính lời giải cho các vấn đề khó giải bằng phương pháp phân tích. Ví dụ, bạn có thể sử dụng số ngẫu nhiên để ước tính giá trị của số Pi ($\pi$).

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

int main(void) {
    int n_trials = 1000000;
    int n_inside = 0;
    double x, y, pi;

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

    for (int i = 0; i < n_trials; i++) {
        x = (double)rand() / RAND_MAX;
        y = (double)rand() / RAND_MAX;
        if (x * x + y * y <= 1) {
            n_inside++;
        }
    }

    pi = 4.0 * n_inside / n_trials;
    printf("Approximated π: %f
", pi);

    return 0;
}

Chương trình này là một ví dụ về phương pháp Monte Carlo ước tính số Pi bằng cách sử dụng các điểm ngẫu nhiên. Nó sử dụng rand() để tạo số ngẫu nhiên trong khoảng từ 0 đến 1 và sử dụng chúng để ước tính diện tích hình tròn.

5. Lưu ý khi sử dụng hàm rand() và srand()

5.1 Hiểu về số giả ngẫu nhiên

Hàm rand() trong C tạo ra số giả ngẫu nhiên. Chúng không phải là giá trị ngẫu nhiên thực sự mà được tính toán dựa trên một thuật toán nội bộ. Do đó, nếu sử dụng cùng một hạt giống, cùng một mẫu số ngẫu nhiên sẽ được tạo ra. Điều này tiện lợi cho việc debug nhưng không phù hợp khi cần sự ngẫu nhiên hoàn toàn.

5.2 Các lỗi thường gặp

Các lỗi phổ biến khi sử dụng số ngẫu nhiên bao gồm việc không sử dụng srand() hoặc hiểu sai về phạm vi đầu ra của rand(). Đặc biệt, nếu bạn không đặt hạt giống bằng srand() trước khi sử dụng rand(), cùng một mẫu số ngẫu nhiên sẽ được tạo ra mỗi lần. Ngoài ra, khi điều chỉnh phạm vi bằng rand() % n, hãy cẩn thận vì giá trị của n có thể dẫn đến kết quả không mong muốn.

Kết luận

Việc tạo số ngẫu nhiên trong C được ứng dụng rộng rãi trong nhiều lĩnh vực như game và mô phỏng. Bằng cách hiểu cách sử dụng hàm rand()srand(), bạn có thể tạo ra các số ngẫu nhiên một cách chính xác, thêm các yếu tố khó đoán vào chương trình của mình. Hy vọng bài viết này sẽ giúp bạn tạo ra các chương trình có sử dụng số ngẫu nhiên một cách hiệu quả.

年収訴求