Tại sao các số ngẫu nhiên không thực sự là con trăn ngẫu nhiên?

Bài viết này trình bày cách sử dụng hàm

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
2 để khởi tạo trình tạo số giả ngẫu nhiên trong Python để lấy dữ liệu ngẫu nhiên xác định mà bạn muốn

Bằng cách đặt giá trị hạt giống tùy chỉnh, chúng tôi có thể tạo lại dữ liệu do trình tạo số giả ngẫu nhiên cung cấp. Chọn các phần tử giống nhau từ danh sách một cách ngẫu nhiên mỗi lần sử dụng

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
2

Cũng thấy

  • Bài tập tạo dữ liệu ngẫu nhiên trong Python
  • Python tạo dữ liệu ngẫu nhiên Quiz

Mục lục

  • Một hạt giống trong một trình tạo ngẫu nhiên là gì?
  • Tại sao và khi nào nên sử dụng hàm seed()
  • Cách sử dụng ngẫu nhiên. hạt giống () chức năng
    • Cú pháp ngẫu nhiên. hạt giống()
    • hạt ngẫu nhiên () để tạo cùng một số ngẫu nhiên mỗi lần
  • Đặt thời gian hệ thống làm giá trị gốc thay vì nguồn ngẫu nhiên dành riêng cho hệ điều hành
  • Nhận giá trị hạt giống được sử dụng bởi trình tạo ngẫu nhiên
  • Hạt giống ngẫu nhiên Python với randrange
  • Sử dụng phương pháp hạt giống và lựa chọn ngẫu nhiên cùng nhau
  • Sử dụng hạt ngẫu nhiên và hàm mẫu cùng nhau
  • Sử dụng chức năng hạt ngẫu nhiên và xáo trộn cùng nhau
  • Bước tiếp theo

Một hạt giống trong một trình tạo ngẫu nhiên là gì?

Giá trị hạt giống là giá trị cơ bản được sử dụng bởi trình tạo giả ngẫu nhiên để tạo số ngẫu nhiên. Số ngẫu nhiên hoặc dữ liệu được tạo bởi mô-đun ngẫu nhiên của Python không thực sự ngẫu nhiên; . e. , xác định.
Mô-đun ngẫu nhiên sử dụng giá trị gốc làm cơ sở để tạo số ngẫu nhiên.

Sử dụng hàm

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
2 với các hàm mô-đun ngẫu nhiên khác để tái tạo lặp đi lặp lại đầu ra của chúng

Tại sao và khi nào nên sử dụng hàm seed()

Giá trị hạt giống rất quan trọng trong bảo mật máy tính để tạo giả ngẫu nhiên khóa mã hóa bí mật an toàn. Vì vậy, bằng cách sử dụng giá trị hạt giống tùy chỉnh, bạn có thể khởi tạo trình tạo số giả ngẫu nhiên mạnh mẽ và đáng tin cậy theo cách bạn muốn

Ngoài ra,

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
2 rất hữu ích để tái tạo dữ liệu được cung cấp bởi trình tạo số giả ngẫu nhiên. Bằng cách sử dụng lại giá trị gốc, chúng tôi có thể tạo lại cùng một dữ liệu nhiều lần khi nhiều luồng không chạy

Khi chúng tôi cung cấp một hạt giống cụ thể cho trình tạo ngẫu nhiên, bạn sẽ nhận được các số giống nhau mỗi khi thực hiện chương trình. Điều đó rất hữu ích khi bạn cần một nguồn số ngẫu nhiên có thể dự đoán được

Cách sử dụng ngẫu nhiên. hạt giống () chức năng

Hãy hiểu hoạt động của hàm

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6

Cú pháp của import random print('Random number with seed 30') for i in range(3): # Random number with seed 30 random.seed(30) print(random.randint(25, 50))2

random.seed(a=None, version=2)

Nó khởi tạo trình tạo số giả ngẫu nhiên với giá trị hạt giống

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
8

Thông số. –

Nó chấp nhận hai tham số. Cả hai đều là tùy chọn

  • import random
    
    print('Random number with seed 30')
    for i in range(3):
        # Random number with seed 30
        random.seed(30)
        print(random.randint(25, 50))
    8. Đó là giá trị hạt giống. Nếu a là Không, thì theo mặc định, thời gian hệ thống hiện tại được sử dụng.
    Nếu hệ điều hành cung cấp các nguồn ngẫu nhiên, chúng sẽ được sử dụng thay cho thời gian hệ thống. Ví dụ: Trên cửa sổ,
    Random number with seed 30
    42
    42
    42
    0 sử dụng nội bộ
    Random number with seed 30
    42
    42
    42
    1 để tạo dữ liệu ngẫu nhiên.
    Nếu bạn chuyển một giá trị gốc ở dạng số nguyên, thì giá trị đó sẽ được sử dụng nguyên trạng.
  • Random number with seed 30
    42
    42
    42
    2. Nếu phiên bản được đặt thành 2 theo mặc định, đối tượng
    Random number with seed 30
    42
    42
    42
    3,
    Random number with seed 30
    42
    42
    42
    4 hoặc
    Random number with seed 30
    42
    42
    42
    5 sẽ được chuyển đổi thành
    Random number with seed 30
    42
    42
    42
    6 và tất cả các bit của nó được sử dụng

Khi chúng tôi nói nguồn ngẫu nhiên dành riêng cho hệ điều hành, điều đó có nghĩa là. –

  • Trên Linux, có thể sử dụng hàm 
    Random number with seed 30
    42
    42
    42
    7 để lấy các byte ngẫu nhiên ở chế độ không chặn
  • Trên hệ thống giống Unix, các byte ngẫu nhiên được đọc từ thiết bị 
    Random number with seed 30
    42
    42
    42
    8
  • Trên Windows, nó sẽ sử dụng 
    Random number with seed 30
    42
    42
    42
    1

Điểm quan trọng

  • Nếu bạn không khởi tạo trình tạo số giả ngẫu nhiên, thì trình tạo ngẫu nhiên sẽ sử dụng các nguồn ngẫu nhiên của hệ điều hành để đặt giá trị gốc. Đó là lý do tại sao bất cứ khi nào chúng tôi thực hiện
    import random
    
    print('Random number with seed 30')
    for i in range(3):
        # Random number with seed 30
        random.seed(30)
        print(random.randint(25, 50))
    90, chúng tôi nhận được một số khác
  • Khi Python không lấy được nguồn ngẫu nhiên dành riêng cho hệ điều hành thì thời gian hệ thống hiện tại theo mặc định được sử dụng làm giá trị gốc

hạt ngẫu nhiên () để tạo cùng một số ngẫu nhiên mỗi lần

Nếu bạn muốn tạo cùng một số mỗi lần, bạn cần chuyển cùng một giá trị gốc trước khi gọi bất kỳ hàm mô-đun ngẫu nhiên nào khác. Hãy xem cách đặt hạt giống trong trình tạo số giả ngẫu nhiên Python

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))

đầu ra

Random number with seed 30
42
42
42

Như chúng ta có thể thấy trong kết quả, chúng ta đã nhận được cùng một số ba lần vì chúng ta đã gieo chúng với cùng một giá trị trước khi gọi một số

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
91

Giả sử bạn gọi ngẫu nhiên. randint() hai lần trước khi gọi một số

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6, bạn sẽ nhận được một số khác. Nếu Nếu bạn muốn dữ liệu khác, hãy chuyển giá trị gốc khác trước khi gọi bất kỳ hàm mô-đun ngẫu nhiên nào khác

Thí dụ

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
9

đầu ra

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
5

Chúng tôi có một số khác ở vị trí thứ hai trong đầu ra vì chúng tôi đã thực hiện randint() hai lần mà không đặt giá trị hạt giống

Ghi chú. Bạn cũng có thể sử dụng các hàm getstate() và setstate(), giúp chúng tôi nắm bắt trạng thái bên trong hiện tại của trình tạo ngẫu nhiên.
Chụp và lưu trữ trạng thái hiện tại bằng cách sử dụng

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
93. Tiếp theo, bất cứ khi nào bạn muốn kết quả tương tự, hãy thay đổi trạng thái hiện tại của số ngẫu nhiên bằng cách sử dụng
import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
94
Bằng cách thay đổi trạng thái hiện tại thành trạng thái trước đó, chúng tôi có thể nhận lại cùng một dữ liệu ngẫu nhiên

Đặt thời gian hệ thống làm giá trị gốc thay vì nguồn ngẫu nhiên dành riêng cho hệ điều hành

Vì bất kỳ lý do gì, nếu bạn muốn đặt một nguồn gốc tùy chỉnh khác với nguồn ngẫu nhiên dành riêng cho hệ điều hành, một phương pháp phổ biến là sử dụng thời gian hệ thống tính bằng mili giây làm giá trị gốc

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
8

Nhận giá trị hạt giống được sử dụng bởi trình tạo ngẫu nhiên

Đôi khi, rất hữu ích khi có thể tái tạo dữ liệu được cung cấp bởi trình tạo số giả ngẫu nhiên. Như bạn đã biết, việc tạo dữ liệu ngẫu nhiên phụ thuộc vào giá trị gốc. Bằng cách sử dụng lại giá trị gốc, chúng tôi có thể tạo lại cùng một dữ liệu nhiều lần khi nhiều luồng không chạy

Ví dụ: Bạn muốn tái tạo kết quả bạn nhận được trong một lần chạy cụ thể. Trong những trường hợp như vậy, bạn muốn biết hạt giống được sử dụng để tái tạo kết quả đó. Giá trị hạt giống hiện tại là điều cần thiết khi bạn muốn kết quả có thể lặp lại

Sử dụng giá trị hạt giống tùy chỉnh, bạn phải nhớ rằng Trình tạo ngẫu nhiên của Python không lưu trữ hạt giống trong bộ nhớ. tôi. e. , Nó không cung cấp bất kỳ phương pháp nào để lấy giá trị hạt giống hiện tại. Tùy thuộc vào bạn để lưu hạt giống nếu bạn muốn sử dụng lại nó. Không thể lấy lại hạt giống tự động từ máy phát điện. Nhưng bạn có thể thử thay thế này

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
9

Cách trên dựa trên thời gian nên mỗi lần bạn thực hiện nó sẽ cho ra một seed khác nhau và nếu bạn thích kết quả đó, bạn có thể sử dụng seed đó để nhận lại kết quả tương tự

Bây giờ, tôi sẽ sử dụng cùng một hạt giống (7616533358804326209) để nhận lại kết quả tương tự

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
0

Ghi chú. Sử dụng phương pháp trên, bạn có thể tạo lại kết quả của bất kỳ chức năng mô-đun ngẫu nhiên nào

Hạt giống ngẫu nhiên Python với randrange

Hãy xem cách sử dụng hàm

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6 để lấy cùng một số ngẫu nhiên trong một phạm vi nhất định

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
2

Sử dụng phương pháp hạt giống và lựa chọn ngẫu nhiên cùng nhau

Hàm lựa chọn ngẫu nhiên() được sử dụng để chọn một phần tử ngẫu nhiên từ danh sách và đặt. Bằng cách đặt giá trị hạt giống tùy chỉnh, bạn có thể chọn cùng một lựa chọn mỗi lần

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
3

Sử dụng hạt ngẫu nhiên và hàm mẫu cùng nhau

Sử dụng hàm sample() ngẫu nhiên, chúng ta có thể chọn các mẫu ngẫu nhiên từ danh sách và các loại chuỗi khác. Hãy xem cách lấy các mẫu ngẫu nhiên giống nhau ra khỏi danh sách mỗi lần sử dụng hàm

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6 và
import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
97

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
0

Sử dụng chức năng hạt ngẫu nhiên và xáo trộn cùng nhau

Chúng tôi cũng có thể sử dụng

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6 và ngẫu nhiên. shuffle() các chức năng cùng nhau. Mục đích chính của việc sử dụng hàm
import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
6 và
import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
50 cùng nhau là tạo ra cùng một kết quả mỗi lần sau mỗi lần xáo trộn. Nếu chúng ta đặt cùng một giá trị hạt giống mỗi lần trước khi gọi hàm
import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
50, chúng ta sẽ nhận được cùng một chuỗi mục. Tôi. e. , việc xáo trộn sẽ tạo ra cùng một kết quả mỗi lần

Thí dụ. –

import random

print('Random number with seed 30')
for i in range(3):
    # Random number with seed 30
    random.seed(30)
    print(random.randint(25, 50))
1

Bước tiếp theo

Hãy cho tôi biết ý kiến ​​​​và phản hồi của bạn trong phần bên dưới

Ngoài ra, hãy thử giải bài tập miễn phí và câu đố sau đây để hiểu rõ hơn về cách làm việc với dữ liệu ngẫu nhiên trong Python

Tại sao số ngẫu nhiên không thực sự ngẫu nhiên?

Tạo số giả ngẫu nhiên. Các số ngẫu nhiên do phần mềm tạo chỉ là giả ngẫu nhiên. Chúng không thực sự ngẫu nhiên vì máy tính sử dụng thuật toán dựa trên phân phối và không an toàn vì chúng dựa trên các thuật toán xác định, có thể dự đoán được .

Mô-đun ngẫu nhiên Python có thực sự ngẫu nhiên không?

Mô-đun Python Random là một mô-đun dựng sẵn của Python được sử dụng để tạo các số ngẫu nhiên. Đây là các số giả ngẫu nhiên có nghĩa là chúng không thực sự ngẫu nhiên . Mô-đun này có thể được sử dụng để thực hiện các hành động ngẫu nhiên như tạo số ngẫu nhiên, in giá trị ngẫu nhiên cho danh sách hoặc chuỗi, v.v.

Là 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.

Python 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 .