Sinh số ngẫu nhiên

C:
Sinh số ngẫu nhiên

Làm thế nào:

Trong C, số ngẫu nhiên có thể được tạo ra sử dụng hàm rand(), là một phần của thư viện tiêu chuẩn C <stdlib.h>. Theo mặc định, rand() tạo ra các số giả ngẫu nhiên trong phạm vi từ 0 đến RAND_MAX (hằng số được định nghĩa trong <stdlib.h>). Để kiểm soát chặt chẽ hơn về phạm vi, các lập trình viên có thể điều chỉnh kết quả đầu ra của rand().

Dưới đây là một ví dụ đơn giản về việc tạo ra một số ngẫu nhiên từ 0 đến 99:

#include <stdio.h>
#include <stdlib.h> // Cho rand() và srand()
#include <time.h>   // Cho time()

int main() {
    // Gieo hạt cho bộ sinh số ngẫu nhiên
    srand((unsigned) time(NULL));

    // Tạo ra một số ngẫu nhiên từ 0 đến 99
    int randomNumber = rand() % 100;

    printf("Số Ngẫu Nhiên: %d\n", randomNumber);

    return 0;
}

Kết quả mẫu có thể thay đổi mỗi lần bạn chạy chương trình này:

Số Ngẫu Nhiên: 42

Để tạo ra số ngẫu nhiên trong một phạm vi khác, bạn có thể điều chỉnh toán tử mô-đun (%) một cách phù hợp. Ví dụ, rand() % 10 tạo ra các số từ 0 đến 9.

Quan trọng là phải ghi nhận rằng, việc gieo hạt cho bộ sinh số giả ngẫu nhiên (srand()) bằng thời gian hiện tại (time(NULL)) đảm bảo các chuỗi số ngẫu nhiên khác nhau qua các lần thực thi chương trình. Nếu không gieo hạt (srand()), rand() sẽ tạo ra cùng một chuỗi số mỗi lần chương trình được chạy.

Sâu hơn nữa

Hàm rand() và hàm gieo hạt tương ứng srand() đã là một phần của thư viện tiêu chuẩn C trong nhiều thập kỷ. Chúng dựa trên các thuật toán tạo ra các chuỗi số chỉ có vẻ là ngẫu nhiên—do đó thuật ngữ “giả ngẫu nhiên.” Thuật toán tiềm ẩn trong rand() thường là một bộ sinh số tuyến tính đồng nhất (LCG).

Mặc dù rand()srand() đủ cho nhiều ứng dụng, chúng có những hạn chế được biết đến, đặc biệt liên quan đến chất lượng của sự ngẫu nhiên và khả năng dự đoán. Đối với các ứng dụng yêu cầu sự ngẫu nhiên cao cấp, chẳng hạn như các hoạt động mật mã, các lựa chọn thay thế như /dev/random hoặc /dev/urandom (trên các hệ thống giống Unix), hoặc các API do các thư viện mật mã cung cấp, nên được xem xét.

Với sự ra đời của C11, tiêu chuẩn ISO C đã bao gồm một header mới, <stdatomic.h>, cung cấp một sự kiểm soát tinh tế hơn cho các thao tác đồng thời, nhưng không trực tiếp liên quan đến sự ngẫu nhiên. Để đạt được sự ngẫu nhiên thực sự trong C, các nhà phát triển thường chuyển sang các thư viện cụ thể của nền tảng hoặc bên ngoài cung cấp các thuật toán tốt hơn hoặc tận dụng các nguồn entropy phần cứng.

Nhớ rằng, trong khi rand() phục vụ như một phương tiện đơn giản và dễ tiếp cận để tạo ra số giả ngẫu nhiên, việc sử dụng nó trong các ứng dụng hiện đại bị hạn chế bởi chất lượng và sự dự đoán của đầu ra. Khi cần các giải pháp mạnh mẽ hơn, đặc biệt là đối với các ứng dụng quan tâm đến bảo mật, việc tìm kiếm ngoài thư viện tiêu chuẩn được khuyến khích cao.