Hàm random() trong Python có thực sự “ngẫu nhiên”?

Tram Ho

Ngay cả đối với một người không quan tâm đến lập trình máy tính, sự hữu ích của việc tạo ra số ngẫu nhiên trong một số trường hợp nhất định là điều đương nhiên. Trong các trò chơi, chúng ta ném xúc xắc để tạo ra một con số không thể đoán trước, xác định bước đi tiếp theo của người chơi. Ngoài ra, tất cả chúng ta đều sẽ đồng ý rằng việc chơi bất cứ một trò chơi bài nào mà không có sự xáo trộn ngẫu nhiên các lá bài sẽ là vô nghĩa.

Ngẫu nhiên thực VS. Giả ngẫu nhiên

Số ngẫu nhiên có thể thu được do áp dụng các phương pháp toán học hay được gọi là bộ tạo số ngẫu nhiên (Random Number Generator – RNG). Nó có thể được chia thành 2 loại: bộ tạo số ngẫu nhiên thực (True Random Number Generators – TRNGs hay còn gọi là bộ tạo số ngẫu nhiên phần cứng) và bộ tạo số giả ngẫu nhiên (Pseudo-random Number Generator – PRNGS).

1. True Random Number Generators

Các bộ tạo số ngẫu nhiên thực là các phương pháp trích rút tính ngẫu nhiên hoặc không thể tiên đoán từ các khía cạnh không thể đoán trước được của các tiến trình vật lý. Các phương thức này không trực tiếp tạo ra các số, mà là các trạng thái, sau đó có thể được diễn dịch sang dạng số – đây là lý do tại sao chúng thường được gọi là các trình tạo sự kiện ngẫu nhiên (Random Event Generators – REGs). Một số trong số chúng, sử dụng các sự kiện vĩ mô phổ biến, như là các phương pháp ném xúc xắc, lật đồng xu hoặc xáo trộn thẻ.

Những bộ tạo số ngẫu nhiên thực này thường sử dụng các hiện tượng vật lý phức tạp hơn. Một số trong số chúng, như phân rã phóng xạ, nhiễu nhiệt hoặc nhiễu vô tuyến, được trích xuất sự khó lường từ đặc thù của cơ học lượng tử. Các phương pháp khác sử dụng tính không thể đoán trước được của tiếng ồn trong khí quyển hoặc thậm chí là trạng thái của đèn đối lưu giọt dầu.

2. Pseudo Random Number Generators

Sự thật là, việc thường xuyên tạo ra những con số phải thực sự ngẫu nhiên là không cần thiết. Trong nhiều trường hợp, tất cả những gì chúng ta cần là các bộ số có vẻ ngẫu nhiên. Loại dữ liệu này có thể được lấy từ các bộ tạo số giả ngẫu nhiên. Đây là các thuật toán, sử dụng một phần nhỏ thông tin (được gọi là seed) và sau đó áp dụng các công thức toán học phức tạp để tạo ra các bộ số xác định giống như các bộ thực sự ngẫu nhiên. Seed có thể là một giá trị được lấy từ một trình tạo số ngẫu nhiên thực sự hoặc một nguồn khác, như đồng hồ của hệ thống hoặc thời gian hiện tại.

Chạy bộ tạo số nhiều lần bằng cùng một seed sẽ dẫn đến cùng một output mỗi lần chạy. Các số kết quả hầu như không thể phân biệt được với các số có nguồn gốc từ các bộ tạo số ngẫu nhiên thực, mặc dù thực tế có một số quy tắc ẩn trong sự phân phối của chúng. Tuy nhiên, đối với nhiều ứng dụng, loại giả ngẫu nhiên xác định này là hoàn toàn đủ.

3. Module Random trong Python

Python cung cấp sẵn một module cực kỳ dễ sử dụng để xử lý với các số ngẫu nhiên. Module này gọi là random, được cài đặt một bộ tạo số giả ngẫu nhiên và chứa các hàm cho phép chúng ta giải quyết trực tiếp nhiều vấn đề lập trình khác nhau sử dụng đến tính ngẫu nhiên.

Module random dựa trên Marsenne Twister – một thuật toán rất phổ biến, là trình tạo số giả ngẫu nhiên mặc định không chỉ cho Python, mà còn cho nhiều hệ thống phần mềm phổ biến khác như Microsoft Excel, MATLAB, R hay PHP. Ưu điểm nổi bật của nó là việc được cấp phép chứng nhận, tính ngẫu nhiên được xác nhận bởi nhiều thử nghiệm thống kê và tốc độ tương đối cao so với các PRNG khác.

Hàm random()

Phương thức quan trọng nhất của module random là phương thức random(). Hầu hết các chức năng khác phụ thuộc vào nó. Phương thức random() tạo ra một số thực float ngẫu nhiên trong phạm vi (0.0, 1.0).

Hàm seed()

Còn tiếp …

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo