Chức năng ngẫu nhiên trong python có thực sự ngẫu nhiên không?

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 randomrandom[]. 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

Hã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

Tạo số nguyên ngẫu nhiên

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]
while number % 13 != 0:
number = 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

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]
while number % 13 != 0:
number = random.randrange[10001]
1 gần giống như hàm
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]
while number % 13 != 0:
number = 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
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]
while number % 13 != 0:
number = 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
import randomnumber = random.randrange[10001]
while number % 13 != 0:
number = random.randrange[10001]
7 [2**k-1 cho Pythonist]

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]
while number % 13 != 0:
number = 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]

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=

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]
while number % 13 != 0:
number = random.randrange[10001]
6 ]

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 = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
1 gần giống như
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 = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
4 , bạn có thể nhận được kết quả là một chuỗi chứa bốn lần số
precision = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
5. Với
precision = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
1 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ì
precision = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
7 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

[Với

precision = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
1 bạn không cần chỉ định tên của tham số]

Lưu ý rằng nếu bạn gọi

precision = 4
print[ round[random.uniform[0, 100], precision] ]
# 20.2603
1 với
import randomnumber = random.randrange[10001]
while number % 13 != 0:
number = random.randrange[10001]
6 lớn hơn độ dài của chuỗi, bạn sẽ nhận được kết quả sau

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ư sau

import 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ơn

cụ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ứu

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 khi vấn đề bảo mật

Đâ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]

Là chức năng ngẫu nhiên thực sự ngẫu nhiên?

Ngẫu nhiên là ngẫu nhiên, phải không? . Vì máy tính không có trí tưởng tượng, nên về mặt vật lý, chúng không thể đưa ra một con số thực sự ngẫu nhiên. Nếu bạn sử dụng các hàm tích hợp để ngẫu nhiên hóa một số, nó sẽ tạo ra một số giả ngẫu nhiên bằng thuật toán phức tạp. Not really. Since computers have no imagination whatsoever, it is physically impossible for them to come up with a truly random number. If you use built-in functions to randomize a number, it will produce a pseudo-random number using a complex algorithm.

Ngẫu nhiên Randint[] có thực sự ngẫu nhiên không?

Chúng tôi gọi randint là trình tạo số giả ngẫu nhiên [PRNG] vì nó tạo ra các số có vẻ ngẫu nhiên nhưng không thực sự ngẫu nhiên .

Numpy ngẫu nhiên có thực sự ngẫu nhiên không?

Tạo số ngẫu nhiên với numpy . rand[] đầu ra chỉ có thể xác định và không thể thực sự ngẫu nhiên . Do đó, numpy phải nghĩ ra một mẹo để tạo ra các chuỗi số trông giống như ngẫu nhiên và hoạt động như thể chúng đến từ một nguồn hoàn toàn ngẫu nhiên và đây là PRNG.

Random[] hoạt động như thế nào trong Python?

Phương thức random[] trả về một số thực ngẫu nhiên trong khoảng từ 0 đến 1 .

Chủ Đề