Sinh số ngẫu nhiên trong C

Xin chào các bạn đang theo đuổi lập trình! Hôm nay, chúng ta sẽ cùng nhau khám phá thế giới thú vị của việc sinh số ngẫu nhiên trong ngôn ngữ C. Như một người giáo viên khoa học máy tính gần gũi, tôi ở đây để hướng dẫn các bạn qua hành trình này với rất nhiều ví dụ và giải thích. Hãy cùng bắt đầu nhé!

C - Random Number Generation

Những gì là số ngẫu nhiên?

Trước khi chúng ta nhảy vào mã code, hãy hiểu xem số ngẫu nhiên là gì. Hãy tưởng tượng bạn đang chơi một trò chơi bảng và cần掷 một con xúc xắc. Con số bạn nhận được là không thể dự đoán trước, phải không? Đó chính là điều chúng ta cố gắng đạt được với số ngẫu nhiên trong lập trình.

Trong C, chúng ta sử dụng một hàm gọi là rand() để sinh số ngẫu nhiên. Nhưng đây là một sự thật thú vị: những số này không phải là ngẫu nhiên thực sự! Chúng thực ra là "ngẫu nhiên giả", có nghĩa là chúng theo một mẫu xuất hiện ngẫu nhiên nhưng thực chất là xác định. Đừng lo lắng nếu điều này听起来 phức tạp - chúng ta sẽ khám phá thêm về điều này khi tiếp tục.

Bắt đầu

Để sử dụng số ngẫu nhiên trong C, chúng ta cần bao gồm một thư viện đặc biệt gọi là stdlib.h. Thư viện này chứa hàm rand() mà chúng ta sẽ sử dụng. Dưới đây là cách chúng ta bao gồm nó:

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

Bây giờ, hãy xem một số ví dụ!

Ví dụ 1: Sinh một số ngẫu nhiên

Hãy bắt đầu với một chương trình đơn giản để sinh một số ngẫu nhiên:

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

int main() {
int random_number = rand();
printf("Số ngẫu nhiên: %d\n", random_number);
return 0;
}

Khi bạn chạy chương trình này, bạn sẽ thấy một số ngẫu nhiên được in ra màn hình. Nhưng đợi đã! Nếu bạn chạy nó nhiều lần, bạn có thể nhận thấy một điều kỳ lạ - bạn nhận được cùng một số mỗi lần! Điều gì đang xảy ra ở đây?

Điều này đưa chúng ta đến một khái niệm quan trọng trong việc sinh số ngẫu nhiên:种子 (seed).

Seed và hàm srand()

Seed là như điểm bắt đầu cho việc sinh số ngẫu nhiên của chúng ta. Mặc định, rand() sử dụng cùng một seed mỗi khi chương trình của bạn chạy, đó là lý do bạn nhận được cùng một "số ngẫu nhiên".

Để sửa điều này, chúng ta sử dụng hàm srand() để đặt một seed khác nhau mỗi lần. Một thực hành phổ biến là sử dụng thời gian hiện tại làm seed, vì nó thay đổi mỗi giây. Dưới đây là cách chúng ta làm điều đó:

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

int main() {
srand(time(NULL));  // Đặt seed
int random_number = rand();
printf("Số ngẫu nhiên: %d\n", random_number);
return 0;
}

Bây giờ, mỗi khi bạn chạy chương trình này, bạn nên nhận được một số ngẫu nhiên khác nhau!

Ví dụ 2: Sinh số ngẫu nhiên trong một phạm vi

Thường xuyên, chúng ta muốn số ngẫu nhiên trong một phạm vi cụ thể. Ví dụ, nếu chúng ta muốn mô phỏng việc掷 một con xúc xắc sáu mặt? Dưới đây là cách chúng ta có thể làm điều đó:

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

int main() {
srand(time(NULL));
int die_roll = (rand() % 6) + 1;
printf("Bạn đã掷 được %d\n", die_roll);
return 0;
}

Trong ví dụ này, chúng ta sử dụng phép toán modulo (%) để giới hạn phạm vi của chúng ta trong 0-5, sau đó thêm 1 để dịch chuyển nó thành 1-6. Đây là một kỹ thuật phổ biến để sinh số ngẫu nhiên trong một phạm vi cụ thể.

Ví dụ 3: Sinh nhiều số ngẫu nhiên

Bây giờ, hãy sinh nhiều số ngẫu nhiên. Chúng ta sẽ tạo một chương trình đơn giản để mô phỏng việc掷 con xúc xắc năm lần:

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

int main() {
srand(time(NULL));
printf("Đ掷 con xúc xắc năm lần:\n");
for (int i = 0; i < 5; i++) {
int roll = (rand() % 6) + 1;
printf("Lần掷 %d: %d\n", i+1, roll);
}
return 0;
}

Chương trình này sử dụng một vòng lặp for để掷 con xúc xắc năm lần, in kết quả mỗi lần.

Hàm srand() chi tiết

Hãy xem xét kỹ hơn hàm srand(). Như chúng ta đã đề cập trước đó, nó đặt seed cho bộ sinh số ngẫu nhiên. Dưới đây là bảng tóm tắt cách sử dụng của nó:

Hàm Mô tả Tham số Giá trị trả về
srand() Đặt seed cho bộ sinh số ngẫu nhiên Unsigned int seed Không có (void)

Giá trị time(NULL) mà chúng ta đã sử dụng trả về thời gian hiện tại tính theo giây kể từ ngày 1 tháng 1 năm 1970. Giá trị này thay đổi mỗi giây, làm cho nó là một lựa chọn tốt để đặt seed cho bộ sinh số ngẫu nhiên.

Lưu ý, bạn chỉ cần gọi srand() một lần ở đầu chương trình. Gọi nó nhiều lần với cùng một seed sẽ đặt lại chuỗi số ngẫu nhiên, điều này có thể không phải là điều bạn muốn.

Kết luận

Và thế là chúng ta đã khám phá cơ bản về việc sinh số ngẫu nhiên trong C. Chúng ta đã học về hàm rand(), tầm quan trọng của việc đặt seed với srand(), và cách sinh số ngẫu nhiên trong một phạm vi cụ thể.

Nhớ rằng, số ngẫu nhiên vô cùng hữu ích trong lập trình. Chúng được sử dụng trong trò chơi, mô phỏng, mật mã học, và nhiều hơn nữa. Khi bạn tiếp tục hành trình lập trình của mình, bạn sẽ tìm thấy vô số cách sử dụng những gì bạn đã học hôm nay.

Tiếp tục thực hành, tiếp tục lập mã, và quan trọng nhất, hãy vui vẻ! Ai biết được? Có thể bạn sẽ sử dụng những kỹ năng này để tạo ra trò chơi video lớn tiếp theo hoặc mô phỏng khoa học đột phá. Các khả năng là vô tận như những số ngẫu nhiên bạn có thể sinh ra!

Credits: Image by storyset