Ngay cả đối với một người không quan tâm đến lập trình máy tính, tính hữu ích của việc tạo số ngẫu nhiên trong một số trường hợp nhất định là rõ ràng. Trong các trò chơi, chúng tôi tung xúc xắc để tạo ra một con số khó đoán, xác định nước đi tiếp theo của người chơi. Ngoài ra, tất cả chúng ta đều đồng ý rằng chơi bất kỳ trò chơi bài nào mà không có sự xáo trộn ngẫu nhiên của các quân bài sẽ là vô nghĩa
VS thực ngẫu nhiên. giả ngẫu nhiên
Số ngẫu nhiên có thể thu được bằng cách áp dụng các phương pháp toán học hay còn gọi là Trình tạo số ngẫu nhiên [RNG]. Nó có thể được chia thành 2 loại. nhà máy tạo số ngẫu nhiên [True Random Number Generators – TRNGs còn được gọi là phần cứng tạo số ngẫu nhiên] và số giả ngẫu nhiên được tạo ra [Pseudo-Random Number Generator – PRNGS]
1. Trình tạo số ngẫu nhiên thực
Bộ tạo số ngẫu nhiên thực là phương pháp trích xuất các thuộc tính ngẫu nhiên hoặc không thể đoán trước từ các khía cạnh không thể đoán trước của các quá trình vật lý. Các phương pháp này không trực tiếp tạo ra các số, nhưng các trạng thái, sau đó có thể được diễn giải thành các 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. Máy phát điện – REG ]. Một số trong số chúng, sử dụng các sự kiện vĩ mô phổ biến, như phương pháp tung xúc xắc, tung đồng xu hoặc xáo bài
Những trình 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, chẳng hạn như phân rã phóng xạ, nhiễu nhiệt hoặc nhiễu sóng vô tuyến, rút ra tính không thể đoán trước từ các đặ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ủa tiếng ồn trong khí quyển hoặc thậm chí trạng thái đối lưu của giọt dầu
2. Trình tạo số ngẫu nhiên giả
Sự thật là không nhất thiết phải thường xuyên tạo ra các số thực sự ngẫu nhiên. Trong nhiều trường hợp, tất cả những gì chúng ta cần là các bộ số dường như ngẫu nhiên. Loại dữ liệu này có thể được lấy từ các trình tạo số giả ngẫu nhiên. Đây là các thuật toán sử dụng một mẩu thông tin nhỏ [được gọi là hạt giống] và sau đó áp dụng các công thức toán học phức tạp để tạo ra các tập hợp xác định giống như các tập hợp thực sự ngẫu nhiên. Một hạt giống có thể là một giá trị được lấy từ một trình tạo số ngẫu nhiên thực hoặc một nguồn khác, chẳng hạn như đồng hồ hệ thống hoặc thời gian hiện tại
Chạy trình tạo một số lần bằng cách sử dụng cùng một hạt giống sẽ dẫn đến cùng một đầu ra mỗi lần. Các số kết quả gần như không thể phân biệt được với các số có nguồn gốc từ các trình tạo số ngẫu nhiên thực, mặc dù thực tế là có một số quy tắc ẩn trong 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à đủ
3. Mô-đun ngẫu nhiên trong Python
Python cung cấp sẵn một module cực kỳ dễ sử dụng để xử lý số ngẫu nhiên. Mô-đun này, được gọi là random
, được cài đặt với bộ tạo số giả ngẫu nhiên và chứa các chức năng cho phép chúng tôi giải quyết trực tiếp nhiều vấn đề lập trình khác nhau bằng cách sử dụng tính ngẫu nhiên
Mô-đun 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 hoặc PHP. Ưu điểm nổi bật của nó là được chứng nhận, tính ngẫu nhiên được xác nhận qua 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 ngẫu nhiên []
Phương pháp quan trọng nhất của mô-đun random
là random[]
. Hầu hết các chức năng khác phụ thuộc vào nó. random[]
tạo một số float ngẫu nhiên ngẫu nhiên trong phạm vi [0. 0, 1. 0]
Tính ngẫu nhiên là một trong những tính năng thiết yếu của thế giới. Trong phát triển phần mềm và khoa học dữ liệu, chúng ta thường cần xử lý những thứ ngẫu nhiên
Tuy nhiên, máy tính vốn đã không giỏi về những thứ ngẫu nhiên. Chỉ cần chúng ta sử dụng thuật toán do con người đặt ra để lấy một con số, máy sẽ làm theo…
Mô-đun
import randomnumber_between_0_and_100 = random.randrange[101]4 của thư viện chuẩn Python là một trong những mô-đun đầu tiên được người mới bắt đầu khám phá, nhưng tôi thường thấy mọi người sử dụng sai chức năng khi cân nhắc những gì họ cần làm
Lần đầu tiên tôi sử dụng mô-đun này là khi tôi mới bắt đầu viết mã bằng Python. Tôi đang mã hóa một trò chơi rất đơn giản, trong đó mục tiêu chỉ là đoán một số được tạo ngẫu nhiên. Nếu dự đoán của bạn quá cao, chương trình sẽ yêu cầu thử một số thấp hơn và nếu dự đoán của bạn quá thấp, chương trình sẽ yêu cầu thử một số lớn hơn
Vì vậy, là một lập trình viên thích hợp, tôi bắt đầu tìm kiếm nhu cầu của mình trên google
cách tạo số ngẫu nhiên trong Python3?
Và có lẽ tôi đã bắt gặp một câu hỏi về StackOverflow [ngạc nhiên phải không?] trong đó câu trả lời hàng đầu yêu cầu tôi nhập mô-đun
import randomnumber_between_0_and_100 = random.randrange[101]4
Vì vậy, tôi đã trực tiếp vào trình chỉnh sửa của mình và nhập mô-đun
import random
Tôi đã sẵn sàng sử dụng mô-đun, ngoại trừ một điều, tôi không biết nó hoạt động như thế nào. Giống như hầu hết những người mới bắt đầu, tôi hơi sợ tài liệu và không biết tìm thông tin mình cần ở đâu
Tạo số nguyên ngẫu nhiênHãy để tôi viết một hướng dẫn đơn giản giống như hướng dẫn mà tôi muốn đọc vào lúc này
sắp xếp lại
Chức năng cơ bản nhất của mô-đun này là
import randomnumber_between_0_and_100 = random.randrange[101]6. Đây là những gì tài liệu cho chúng ta biết
“Randrange trả về một phần tử được chọn ngẫu nhiên từ
import randomnumber_between_0_and_100 = random.randrange[101]7, nhưng không thực sự xây dựng một đối tượng phạm vi. ”
Hãy xem một ví dụ đơn giản
Nếu bạn muốn một số từ 0 đến 100, nghĩa là, một số trong
import randomnumber_between_0_and_100 = random.randrange[101]8 , bạn chỉ cần làm như sau
import randomnumber_between_0_and_100 = random.randrange[101]
Vâng, cơ bản. Nhưng hãy tưởng tượng một trường hợp phức tạp hơn. Hãy tưởng tượng bạn cần tạo bội số ngẫu nhiên của 13 trong khoảng từ 0 đến 10 000. [Tôi đồng ý, đây có thể không phải là một nhu cầu rất phổ biến nhưng dù sao đi nữa]. Điều đầu tiên bạn có thể nghĩ ra có thể giống như vậy, đầu tiên bạn tạo một số và thứ hai bạn kiểm tra xem đó có phải là bội số của 13 không
import randomnumber = random.randrange[10001]
while number % 13 != 0:
number = random.randrange[10001]
Đó là cách “trực quan” nhất, nhưng không hiệu quả nhất, chúng ta có thể tận dụng hàm
import randomnumber_between_0_and_100 = random.randrange[101]6, như chúng ta đã thấy trước đây, số được chọn từ
import randomnumber = random.randrange[10001]0, chúng ta có thể sử dụng đối số bước, để nói với Python rằng chúng ta chỉ muốn bội số của
while number % 13 != 0:
number = random.randrange[10001]
import randomnumber = random.randrange[0, 10001, 13]
Bạn thấy mã của chúng tôi sạch hơn và hiệu quả hơn mã trước đây
nói tục tĩu
Hàm
import randomnumber = random.randrange[10001]1 gần giống như hàm
while number % 13 != 0:
number = random.randrange[10001]
import randomnumber_between_0_and_100 = random.randrange[101]6 , điểm khác biệt duy nhất là nó bao hàm. Điều đó có nghĩa là_______7_______3 giống như
import randomnumber = random.randrange[10001]4. Tùy bạn chọn cái bạn muốn sử dụng. [Nếu hiệu suất là một mối quan tâm, tôi khuyên bạn nên sử dụng
while number % 13 != 0:
number = random.randrange[10001]
import randomnumber_between_0_and_100 = random.randrange[101]6 , điều này là do việc triển khai CPython]
getrandbit
Hàm này cũng rất đơn giản, nó chỉ chấp nhận một đối số,
import randomnumber = random.randrange[10001]6 và hàm trả về một số k-bit dương ngẫu nhiên, nghĩa là, một số trong khoảng từ 0 đến
while number % 13 != 0:
number = random.randrange[10001]
import randomnumber = random.randrange[10001]7 [2**k-1 cho Pythonist]
while number % 13 != 0:
number = random.randrange[10001]
Nếu bạn muốn một số ngẫu nhiên 7 bit, tôi. e. dưới 128, bạn chỉ có thể viết cái này
import randomnumber = random.getrandbits[7]
[Lưu ý
import randomnumber_between_0_and_100 = random.randrange[101]6 và
import randomnumber = random.randrange[10001]1 đều dựa trên chức năng này nên đối với các buổi biểu diễn, sử dụng chức năng này có thể là một ý tưởng hay]
while number % 13 != 0:
number = random.randrange[10001]
Tạo số thực ngẫu nhiên
Cho đến giờ chúng ta đã biết cách tạo ra các số nguyên ngẫu nhiên;
ngẫu nhiên
Chức năng
import randomnumber_between_0_and_100 = random.randrange[101]4 có lẽ là chức năng quan trọng nhất trong toàn bộ mô-đun, vì nhiều chức năng của mô-đun được dựa trên nó. Nó trả về một số ngẫu nhiên giữa 0 [bao gồm] và 1 [không bao gồm]. Bản thân chức năng này có thể không hữu ích lắm trừ khi bạn muốn xây dựng các chức năng của riêng mình để tạo số ngẫu nhiên
đồng phục
Hàm này là phiên bản dấu phẩy động của
import randomnumber_between_0_and_100 = random.randrange[101]6 , nó trả về một giá trị float ngẫu nhiên trong khoảng từ
import randomnumber = random.randrange[0, 10001, 13]2 đến
import randomnumber = random.randrange[0, 10001, 13]3. Bạn có thể kết hợp chức năng này với chức năng
import randomnumber = random.randrange[0, 10001, 13]4 tích hợp để có được độ chính xác cần thiết
precision = 4
print[ round[random.uniform[0, 100], precision] ]# 20.2603
Xử lý trình tự
Mô-đun ngẫu nhiên cũng cung cấp một số chức năng tiện dụng để xử lý các chuỗi
sự lựa chọn
Hàm này rất đơn giản,
import randomnumber = random.randrange[0, 10001, 13]5 trả về cho bạn một phần tử ngẫu nhiên của dãy
Ví dụ:
import randomnumber = random.randrange[0, 10001, 13]6 sẽ trả lại một lá thư trong khoảng thời gian từ
import randomnumber = random.randrange[0, 10001, 13]2 đến
import randomnumber = random.randrange[0, 10001, 13]8
Chúng ta có thể tưởng tượng rằng việc triển khai hàm là phiên bản C của đoạn mã sau
def choice[seq]:
return seq[random.randrange[len[seq]]]
Lưu ý rằng nếu chuỗi trống, hàm sẽ tăng
import randomnumber = random.randrange[0, 10001, 13]9
lựa chọn
import randomnumber = random.getrandbits[7]0 là phiên bản nâng cao của
import randomnumber = random.randrange[0, 10001, 13]5 , nó cho phép bạn có nhiều lựa chọn, hãy xem chức năng này dưới dạng phiên bản C của đoạn mã sau
def choices[seq, k]:
results = set[]
for i in range[k]:
results.add[random.choice[seq]]
return results
[Lưu ý rằng hàm này thực tế phức tạp hơn một chút, bạn có thể chuyển các trọng số làm tham số để thay đổi cơ hội của mọi phần tử được chọn. ]
Cú pháp như sau
results = random.choices[seq, k=4] # note the k=
Vì
import randomnumber = random.getrandbits[7]0 có thể nhận nhiều đối số hơn [tham số
import randomnumber = random.getrandbits[7]3], bạn phải chỉ định tên của đối số [
import randomnumber = random.randrange[10001]6 ]
while number % 13 != 0:
number = random.randrange[10001]
Hãy xem một ví dụ phức tạp hơn với trọng số
seq = ['a', 'b', 'c']
weights = [2, 4, 3]
print[random.choices[seq, weights, k=10]]# ['b', 'c', 'b', 'b', 'b', 'c', 'a', 'b', 'b', 'b']
Như bạn có thể thấy ở đây, chuỗi kết quả chứa bảy
import randomnumber = random.randrange[0, 10001, 13]3 cho chỉ một
import randomnumber = random.randrange[0, 10001, 13]2 và hai
import randomnumber = random.getrandbits[7]7, điều này là do các trọng số, ở đây, kết quả giống như nếu danh sách của chúng ta chứa 2
import randomnumber = random.randrange[0, 10001, 13]2, 4
import randomnumber = random.randrange[0, 10001, 13]3 và 3
import randomnumber = random.getrandbits[7]7
import randomnumber_between_0_and_100 = random.randrange[101]0
vật mẫu
precision = 41 gần giống như
print[ round[random.uniform[0, 100], precision] ]# 20.2603
import randomnumber = random.getrandbits[7]0 , ngoại trừ không thể thay thế [và không có tham số
import randomnumber = random.getrandbits[7]3], có nghĩa là chẳng hạn, nếu bạn gọi
precision = 44 , bạn có thể nhận được kết quả là một chuỗi chứa bốn lần số
print[ round[random.uniform[0, 100], precision] ]# 20.2603
precision = 45. Với
print[ round[random.uniform[0, 100], precision] ]# 20.2603
precision = 41 thì khác, mỗi phần tử của dãy chỉ có mặt 1 lần trong kết quả. Nếu chúng ta sử dụng cùng một ví dụ, thì
print[ round[random.uniform[0, 100], precision] ]# 20.2603
precision = 47 chỉ có thể chứa một lần mỗi số. Một kết quả khả dĩ có thể là ____26_______8 hoặc ____26_______9, nhưng không thể lấy ____31_______0 chẳng hạn
print[ round[random.uniform[0, 100], precision] ]# 20.2603
[Với
precision = 41 bạn không cần chỉ định tên của tham số]
print[ round[random.uniform[0, 100], precision] ]# 20.2603
Lưu ý rằng nếu bạn gọi
precision = 41 với
print[ round[random.uniform[0, 100], precision] ]# 20.2603
import randomnumber = random.randrange[10001]6 lớn hơn độ dài của chuỗi, bạn sẽ nhận được kết quả sau
while number % 13 != 0:
number = random.randrange[10001]
import randomnumber_between_0_and_100 = random.randrange[101]1
xáo trộn
Hàm
def choice[seq]:
return seq[random.randrange[len[seq]]]
4 đôi khi có thể rất hữu ích. Nó cho phép bạn trộn một chuỗi tại chỗ. Ví dụ, hãy tưởng tượng bạn có một bộ bài và bạn muốn trộn nó lên. Bạn chỉ có thể làm như sauimport randomnumber_between_0_and_100 = random.randrange[101]2
Và bây giờ thứ tự nên đã thay đổi
import randomnumber_between_0_and_100 = random.randrange[101]3
Vì vậy,
def choice[seq]:
return seq[random.randrange[len[seq]]]
4 thực sự chỉ là một triển khai tại chỗ của def choice[seq]:
return seq[random.randrange[len[seq]]]
6, điều này trở nên hữu ích hơn khi kích thước của chuỗi bắt đầu lớn hơncục mịch. ngẫu nhiên
Nếu bạn biết mô-đun
def choice[seq]:
return seq[random.randrange[len[seq]]]
7, bạn có thể đã thấy def choice[seq]:
return seq[random.randrange[len[seq]]]
8 , đây là cách triển khai mô-đun ngẫu nhiên của NumPy. NumPy nổi tiếng là rất nhanh, nhưng hãy cẩn thận về điều đó. Trước khi đưa ra quyết định sử dụng nó, bạn phải nhớ rằng điều này được tạo ra để xử lý các mảng lớn, nếu bạn không xử lý các mảng lớn, sử dụng NumPy có lẽ là một sự lãng phí thời gian⚠️ Khi bạn không được sử dụng mô-đun ngẫu nhiên ⚠️
Bạn phải nhớ rằng mô-đun
import randomnumber_between_0_and_100 = random.randrange[101]4 hoàn toàn không được tạo ra để sử dụng cho mật mã hoặc bảo mật. Bạn không bao giờ được sử dụng
import randomnumber_between_0_and_100 = random.randrange[101]4 hoặc
def choice[seq]:
return seq[random.randrange[len[seq]]]
8 trong những trường hợp như vậy. Một giải pháp thay thế tốt là mô-đun def choices[seq, k]:
results = set[]
for i in range[k]:
results.add[random.choice[seq]]
return results
2 từ thư viện chuẩn. Nhưng trước mọi thứ, tôi khuyên bạn nên tự mình nghiên cứuBạn không bao giờ được sử dụng
import randomnumber_between_0_and_100 = random.randrange[101]4 hoặcdef choice[seq]:
8 khi vấn đề bảo mật
return seq[random.randrange[len[seq]]]
Đây là một hướng dẫn đơn giản nhưng khá đầy đủ, tôi không đi sâu vào các chi tiết kỹ thuật, nhưng để biết thêm thông tin, hãy xem xét tài liệu hoặc mã nguồn [được dịch bằng Python từ C để thuận tiện hơn]