Ngẫu nhiên là ngẫu nhiên như thế nào? . Bất cứ khi nào bạn đang tạo dữ liệu, chuỗi hoặc số ngẫu nhiên trong Python, bạn nên có ít nhất một ý tưởng sơ bộ về cách dữ liệu đó được tạo
Tại đây, bạn sẽ đề cập đến một số tùy chọn khác nhau để tạo dữ liệu ngẫu nhiên trong Python, sau đó xây dựng để so sánh từng tùy chọn về mức độ bảo mật, tính linh hoạt, mục đích và tốc độ của nó
Tôi hứa rằng hướng dẫn này sẽ không phải là một bài học về toán học hay mật mã, những thứ mà ngay từ đầu tôi đã không được trang bị tốt để giảng bài. Bạn sẽ học toán nhiều như cần thiết, và không còn nữa
Ngẫu nhiên là ngẫu nhiên như thế nào?
Đầu tiên, một tuyên bố từ chối trách nhiệm nổi bật là cần thiết. Hầu hết dữ liệu ngẫu nhiên được tạo bằng Python không hoàn toàn ngẫu nhiên theo nghĩa khoa học của từ này. Thay vào đó, nó là giả ngẫu nhiên. được tạo bằng trình tạo số giả ngẫu nhiên (PRNG), về cơ bản là bất kỳ thuật toán nào để tạo dữ liệu có vẻ ngẫu nhiên nhưng vẫn có thể tái tạo
Các số ngẫu nhiên “đúng” có thể được tạo bởi, bạn đoán xem, một bộ tạo số ngẫu nhiên thực (TRNG). Một ví dụ là liên tục nhặt một con súc sắc trên sàn, tung nó lên không trung và để nó tiếp đất theo cách nó có thể.
Giả sử rằng cú tung của bạn không thiên vị, bạn thực sự không biết con súc sắc sẽ rơi vào số nào. Tung xúc xắc là một hình thức sử dụng phần cứng thô sơ để tạo ra một con số không mang tính quyết định. (Hoặc, bạn có thể nhờ xúc xắc làm việc này cho bạn. ) TRNG nằm ngoài phạm vi của bài viết này nhưng dù sao cũng đáng được đề cập để so sánh
PRNG, thường được thực hiện bằng phần mềm thay vì phần cứng, hoạt động hơi khác một chút. Đây là một mô tả ngắn gọn
Họ bắt đầu với một số ngẫu nhiên, được gọi là hạt giống, sau đó sử dụng thuật toán để tạo chuỗi bit giả ngẫu nhiên dựa trên nó. (Nguồn)
Bạn có thể đã được yêu cầu “đọc tài liệu. " ở một điểm nào đó. Chà, những người đó không sai. Đây là một đoạn trích đặc biệt đáng chú ý từ tài liệu của mô-đun
2 của Python. Đó là những gì làm cho các cuộc gọi tiếp theo để tạo các số ngẫu nhiên mang tính xác định. đầu vào A luôn tạo ra đầu ra B. Phước lành này cũng có thể là một lời nguyền nếu nó được sử dụng ác ý
Có lẽ thuật ngữ “ngẫu nhiên” và “tất định” dường như không thể tồn tại cạnh nhau. Để làm cho điều đó rõ ràng hơn, đây là một phiên bản rút gọn của
8 ban đầu được định nghĩa là một giá trị hạt giống và sau đó biến thành một chuỗi số xác định dựa trên hạt giống đó
classNotSoRandom(object):defseed(self,a=3):"""Seed the world's most mysterious random number generator."""self.seedval=adefrandom(self):"""Look, random numbers!"""self.seedval=(self.seedval*3)%19returnself.seedval_inst=NotSoRandom()seed=_inst.seedrandom=_inst.random
Đừng lấy ví dụ này theo nghĩa đen, vì nó chủ yếu nhằm minh họa khái niệm. Nếu bạn sử dụng giá trị khởi đầu 1234, chuỗi các cuộc gọi tiếp theo tới ____0_______6 phải luôn giống hệt nhau
Bạn sẽ sớm thấy một minh họa nghiêm túc hơn về điều này
Loại bỏ các quảng cáo
“Bảo mật bằng mật mã” là gì?
Nếu bạn chưa có đủ với các từ viết tắt của RNG RNG, hãy thêm một từ nữa vào hỗn hợp. CSPRNG hoặc PRNG bảo mật bằng mật mã. CSPRNG phù hợp để tạo dữ liệu nhạy cảm như mật khẩu, trình xác thực và mã thông báo. Đưa ra một chuỗi ngẫu nhiên, thực tế không có cách nào để Malicious Joe xác định chuỗi nào xuất hiện trước hoặc sau chuỗi đó trong một chuỗi các chuỗi ngẫu nhiên
Một thuật ngữ khác mà bạn có thể thấy là entropy. Tóm lại, điều này đề cập đến mức độ ngẫu nhiên được giới thiệu hoặc mong muốn. Ví dụ: một Python mà bạn sẽ đề cập ở đây xác định
0, số byte sẽ trả về theo mặc định. Các nhà phát triển cho rằng đây là byte "đủ" để tạo ra đủ tiếng ồn
Ghi chú. Thông qua hướng dẫn này, tôi giả sử rằng một byte đề cập đến 8 bit, như nó đã có từ những năm 1960, chứ không phải là một số đơn vị lưu trữ dữ liệu khác. Bạn có thể gọi đây là một octet nếu bạn thích
Một điểm quan trọng về CSPRNG là chúng vẫn là giả ngẫu nhiên. Chúng được thiết kế theo cách nào đó mang tính tất định nội bộ, nhưng chúng thêm một số biến khác hoặc có một số thuộc tính khiến chúng “đủ ngẫu nhiên” để cấm sao lưu vào bất kỳ chức năng nào thực thi thuyết tất định
Những gì bạn sẽ trình bày ở đây
Về mặt thực tế, điều này có nghĩa là bạn nên sử dụng PRNG đơn giản để lập mô hình thống kê, mô phỏng và để tái tạo dữ liệu ngẫu nhiên. Chúng cũng nhanh hơn đáng kể so với CSPRNG, như bạn sẽ thấy ở phần sau. Sử dụng CSPRNG cho các ứng dụng bảo mật và mật mã khi bắt buộc phải có độ nhạy của dữ liệu
Ngoài việc mở rộng các trường hợp sử dụng ở trên, trong hướng dẫn này, bạn sẽ đi sâu vào các công cụ Python để sử dụng cả PRNG và CSPRNG
Nếu bạn tự chạy mã này, tôi cá rằng số tiền tiết kiệm cả đời của tôi sẽ được trả về trên máy của bạn sẽ khác. Khi bạn không khởi tạo trình tạo là sử dụng thời gian hệ thống hiện tại của bạn hoặc "nguồn ngẫu nhiên" từ hệ điều hành của bạn nếu có sẵn
Nếu bạn không muốn thay đổi danh sách ban đầu, trước tiên bạn cần tạo một bản sao và sau đó xáo trộn bản sao. Bạn có thể tạo các bản sao của danh sách Python với mô-đun
Trước khi chuyển sang tạo dữ liệu ngẫu nhiên với NumPy, hãy xem xét thêm một ứng dụng có liên quan một chút. tạo ra một chuỗi các chuỗi ngẫu nhiên duy nhất có độ dài đồng đều
Nó có thể giúp suy nghĩ về thiết kế của chức năng đầu tiên. Bạn cần chọn từ một “nhóm” các ký tự như chữ cái, số và/hoặc dấu chấm câu, kết hợp chúng thành một chuỗi duy nhất, sau đó kiểm tra xem chuỗi này chưa được tạo chưa. Một
Đối với phiên bản tinh chỉnh của hàm này, câu trả lời Stack Overflow này sử dụng các hàm tạo, liên kết tên và một số thủ thuật nâng cao khác để tạo phiên bản nhanh hơn, an toàn bằng mật mã của
2 của riêng NumPy giống như gói ___________2 của thư viện chuẩn, nhưng đối với mảng NumPy. (Nó cũng được tải với khả năng rút ra từ nhiều phân phối thống kê hơn. )
1 và sau đó xem-truyền các số nguyên này thành các giá trị Boolean tương ứng của chúng
>>> ____9_______5
Còn việc tạo dữ liệu tương quan thì sao? . Một cách để giải quyết vấn đề này là sử dụng chức năng của NumPy, tính đến ma trận hiệp phương sai. Nói cách khác, để rút ra từ một biến ngẫu nhiên phân phối bình thường, bạn cần chỉ định giá trị trung bình và phương sai (hoặc độ lệch chuẩn) của nó
Để lấy mẫu từ phân phối chuẩn đa biến, bạn chỉ định ma trận phương tiện và hiệp phương sai, và bạn sẽ có nhiều chuỗi dữ liệu tương quan, mỗi chuỗi được phân phối xấp xỉ chuẩn
Tuy nhiên, thay vì hiệp phương sai, tương quan là thước đo quen thuộc và trực quan hơn đối với hầu hết mọi người. Đó là hiệp phương sai được chuẩn hóa bằng tích của các độ lệch chuẩn và do đó bạn cũng có thể xác định hiệp phương sai theo tương quan và độ lệch chuẩn
Vì vậy, bạn có thể lấy các mẫu ngẫu nhiên từ phân phối chuẩn đa biến bằng cách chỉ định ma trận tương quan và độ lệch chuẩn không? . Ở đây, S là một vectơ của độ lệch chuẩn, P là ma trận tương quan của chúng và C là ma trận hiệp phương sai (hình vuông) kết quả
2 thậm chí có thể nhanh hơn, bởi vì NumPy đi kèm với một số chi phí
Bây giờ bạn đã đề cập đến hai tùy chọn cơ bản cho PRNG, hãy chuyển sang một vài tùy chọn thích ứng an toàn hơn
Loại bỏ các quảng cáo
CSPRNG trong Python
>>> seed(1234)
>>> [random() for _ in range(10)]
[16, 10, 11, 14, 4, 12, 17, 13, 1, 3]
>>> seed(1234)
>>> [random() for _ in range(10)]
[16, 10, 11, 14, 4, 12, 17, 13, 1, 3]
30. Giới thiệu ngẫu nhiên như nó có được
Chức năng của Python được sử dụng bởi cả hai và (cả hai chức năng này bạn sẽ thấy ngay sau đây). Không đi vào quá nhiều chi tiết,
35, từ đó “cho phép truy cập vào tiếng ồn môi trường được thu thập từ trình điều khiển thiết bị và các nguồn khác. ” (Cảm ơn, Wikipedia. ) Đây là thông tin bị cắt xén dành riêng cho trạng thái hệ thống và phần cứng của bạn tại một thời điểm nhưng đồng thời cũng đủ ngẫu nhiên
36 được sử dụng. Hàm này về mặt kỹ thuật vẫn là giả ngẫu nhiên, nhưng nó hoạt động bằng cách tạo giá trị gốc từ các biến như ID tiến trình, trạng thái bộ nhớ, v.v.
30, không có khái niệm gieo thủ công. Mặc dù về mặt kỹ thuật vẫn là giả ngẫu nhiên, chức năng này phù hợp hơn với cách chúng ta nghĩ về tính ngẫu nhiên. Đối số duy nhất là số lượng để trả về
Trước khi chúng ta tiếp tục, đây có thể là thời điểm tốt để đi sâu vào một bài học nhỏ về mã hóa ký tự. Nhiều người, bao gồm cả tôi, có một số phản ứng dị ứng khi họ nhìn thấy
Đầu tiên, hãy nhớ lại một trong những khái niệm cơ bản của điện toán, đó là một byte được tạo thành từ 8 bit. Bạn có thể coi một bit là một chữ số duy nhất là 0 hoặc 1. Một byte chọn một cách hiệu quả giữa 0 và 1 tám lần, vì vậy cả
45, với một số định dạng đặc biệt. chuyển đổi một số nguyên thành biểu diễn nhị phân của nó dưới dạng một chuỗi
Điều đó để chúng ta ở đâu? . (Không có ý định chơi chữ. ) Cho rằng chúng tôi được phép có 8 bit, mỗi bit có 2 lựa chọn, có thể có các tổ hợp _________48 byte. ”
Điều này có nghĩa là mỗi byte ánh xạ tới một số nguyên từ 0 đến 255. Nói cách khác, chúng ta sẽ cần nhiều hơn 8 bit để biểu diễn số nguyên 256. Bạn có thể xác minh điều này bằng cách kiểm tra xem
57 là dấu xuống dòng (một phần của dòng mới, trên hệ thống Windows)
Nếu bạn cần xem lại hệ thập lục phân, Charles Petzold's Code. The Hidden Language là một nơi tuyệt vời cho điều đó. Hex là một hệ thống đánh số cơ số 16, thay vì sử dụng từ 0 đến 9, sử dụng từ 0 đến 9 và a đến f làm các chữ số cơ bản của nó
Cuối cùng, hãy quay lại nơi bạn đã bắt đầu, với chuỗi byte ngẫu nhiên
66) không cần biểu diễn đủ 8 bit, thì ___________62 sẽ luôn sử dụng hai chữ số hex trên mỗi byte, vì vậy số 1 sẽ được biểu diễn dưới dạng ___9_______68 thay vì chỉ ____9_______69. Tuy nhiên, về mặt toán học, cả hai đều có cùng kích thước
Chi tiết kỹ thuật. Điều bạn chủ yếu mổ xẻ ở đây là làm thế nào một đối tượng
Bây giờ, làm thế nào về một ví dụ cụ thể? . com hay bit. ly biến một URL khó sử dụng thành một cái gì đó như https. //chút. ly/2IcCp9u. Hầu hết các trình rút gọn không thực hiện bất kỳ thao tác băm phức tạp nào từ đầu vào đến đầu ra;
Giả sử rằng sau khi xem Cơ sở dữ liệu vùng gốc, bạn đã đăng ký trang web ngắn. ly. Đây là một chức năng giúp bạn bắt đầu với dịch vụ của mình
Đây có phải là một minh họa thực tế đầy đủ? . Tôi sẽ đặt cược chút đó. ly thực hiện mọi thứ theo cách nâng cao hơn một chút so với việc lưu trữ mỏ vàng của nó trong từ điển Python toàn cầu không liên tục giữa các phiên
Ghi chú. Nếu bạn muốn xây dựng một công cụ rút ngắn URL chính thức của riêng mình, thì hãy xem Xây dựng một công cụ rút ngắn URL với FastAPI và Python
Giữ lấy. Một điều bạn có thể nhận thấy là cả hai kết quả này đều có độ dài 7 khi bạn yêu cầu 5 byte. Đợi đã, tôi nghĩ rằng bạn nói rằng kết quả sẽ dài gấp đôi? . Có một điều nữa đang xảy ra ở đây.
98 sử dụng ID máy chủ của máy và thời gian hiện tại theo mặc định. Do sự phụ thuộc vào thời gian hiện tại xuống độ phân giải nano giây, phiên bản này là nơi UUID đưa ra tuyên bố “tính duy nhất được đảm bảo theo thời gian. ”
30, chuyển đổi số này thành số nguyên lớn cuối và thực hiện một số thao tác theo bit để tuân thủ
Hy vọng rằng đến giờ bạn đã hiểu rõ về sự khác biệt giữa các “loại” dữ liệu ngẫu nhiên khác nhau và cách tạo chúng. Tuy nhiên, một vấn đề khác có thể xuất hiện trong đầu là va chạm
Trong trường hợp này, một xung đột chỉ đơn giản đề cập đến việc tạo hai UUID phù hợp. Cơ hội của điều đó là gì? . có thể có
5 là trong Django, trong đó có a thường được sử dụng làm khóa chính trong cơ sở dữ liệu quan hệ cơ bản của mô hìnhLoại bỏ các quảng cáo
Tại sao không chỉ “Mặc định là” >>> # Don't call `random.seed()` yet
>>> import random
>>> random.random()
0.35553263284394376
>>> random.random()
0.6101992345575074
11?
Ngoài các mô-đun bảo mật được thảo luận ở đây, chẳng hạn như
Băm được thiết kế để trở thành ánh xạ một chiều từ giá trị đầu vào sang chuỗi có kích thước cố định mà hầu như không thể đảo ngược kỹ thuật. Như vậy, mặc dù kết quả của hàm băm có thể “trông giống” dữ liệu ngẫu nhiên, nhưng nó không thực sự đủ điều kiện theo định nghĩa ở đây
Tóm tắt lại
Bạn đã bao phủ rất nhiều nền tảng trong hướng dẫn này. Tóm lại, đây là so sánh cấp cao về các tùy chọn có sẵn cho bạn về tính ngẫu nhiên kỹ thuật trong Python
4Được thiết kế để trở thành mô-đun thực tế của Python để tạo các số, byte và chuỗi ngẫu nhiên an toànCó_______10_______5Trang chủ cho một số chức năng cho
Vui lòng để lại một số nhận xét hoàn toàn ngẫu nhiên bên dưới và cảm ơn vì đã đọc
Liên kết bổ sung
Ngẫu nhiên. org cung cấp “số ngẫu nhiên thực sự cho bất kỳ ai trên Internet” bắt nguồn từ tiếng ồn trong khí quyển
Bài báo chuyên đề về Mersienne Twister xuất hiện vào năm 1997, nếu bạn thích loại điều đó
Các hàm xác định để chọn ngẫu nhiên từ một tập hợp tổ hợp, chẳng hạn như từ các tổ hợp hoặc hoán vị
bao gồm các trình tạo mẫu ngẫu nhiên khác nhau có thể được sử dụng để xây dựng các bộ dữ liệu nhân tạo có kích thước và độ phức tạp được kiểm soát
Eli Bendersky đào sâu vào
>>> random.randrange(1,10)5
3 trong bài báo của anh ấy
Giới thiệu cụ thể về Xác suất bằng Python của Peter Norvig cũng là một tài nguyên toàn diện
Thư viện Pandas bao gồm một thư viện có thể được sử dụng để đặt trạng thái ngẫu nhiên tạm thời
Từ tràn ngăn xếp
Tạo ngày ngẫu nhiên trong một phạm vi nhất định
Cách nhanh nhất để tạo một chuỗi duy nhất giống như ngẫu nhiên với độ dài ngẫu nhiên
Cách sử dụng
>>> random.randrange(1,10)5
9 trên Máy phát điện
Thay thế các phần tử ngẫu nhiên trong một mảng NumPy
Lấy số từ/dev/ngẫu nhiên trong Python
Đánh dấu là đã hoàn thành
Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Tạo dữ liệu ngẫu nhiên bằng Python
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Giới thiệu về Brad Solomon
Brad là một kỹ sư phần mềm và là thành viên của Nhóm hướng dẫn Python thực sự
» Thông tin thêm về Brad
Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
Adriana
Geir Arne
Joanna
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Chuyên gia Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ Email
Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi