Random.seed (): Nó làm gì?


177

Tôi hơi bối rối về những gì random.seed()làm trong Python. Ví dụ, tại sao các thử nghiệm dưới đây làm những gì họ làm (nhất quán)?

>>> import random
>>> random.seed(9001)
>>> random.randint(1, 10)
1
>>> random.randint(1, 10)
3
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
6
>>> random.randint(1, 10)
7

Tôi không thể tìm thấy tài liệu tốt về điều này.


30
Tạo số ngẫu nhiên không thực sự "ngẫu nhiên". Nó mang tính quyết định và trình tự mà nó tạo ra được quyết định bởi giá trị hạt giống mà bạn truyền vào random.seed. Thông thường bạn chỉ cần gọi random.seed()và nó sử dụng thời gian hiện tại làm giá trị hạt giống, có nghĩa là bất cứ khi nào bạn chạy tập lệnh, bạn sẽ nhận được một chuỗi các giá trị khác nhau.
Asad Saeeduddin

3
Truyền cùng một hạt giống đến ngẫu nhiên, và sau đó gọi nó sẽ cung cấp cho bạn cùng một bộ số. Điều này hoạt động như dự định và nếu bạn muốn kết quả khác đi mỗi lần bạn sẽ phải gieo nó với thứ gì đó khác nhau mỗi khi bạn khởi động ứng dụng (ví dụ: đầu ra từ / dev / ngẫu nhiên hoặc thời gian)
Tymoteusz Paul

5
Hạt giống là những gì được cung cấp cho RNG để tạo ra số ngẫu nhiên đầu tiên. Sau đó, họ RNG tự ăn. Bạn không thấy câu trả lời tương tự nhất quán vì điều này. Nếu bạn chạy lại tập lệnh này, bạn sẽ nhận được cùng một chuỗi các số "ngẫu nhiên". Đặt hạt giống là hữu ích nếu bạn muốn tạo lại kết quả, vì tất cả các số "ngẫu nhiên" được tạo sẽ luôn giống nhau.
Nháy mắt

Đáng nói hơn: trình tự hiển thị trong bài viết này là trong Python 2. Python 3 đưa ra một trình tự khác.
ggorlen

1
Việc sử dụng "số ngẫu nhiên" của @Blink là sai lệch. RNG có một trạng thái nội bộ là tự ăn. Từ trạng thái nội bộ này, đầu ra cho randint (1,10) và các cuộc gọi khác được bắt nguồn. Nếu RNG được cho ăn từ đầu ra của randint (1.10), chuỗi sẽ sụp xuống 1 trong tối đa 10 chuỗi và chuỗi sẽ lặp lại sau tối đa 10 số.
Joachim Wagner

Câu trả lời:


213

Bộ tạo số giả ngẫu nhiên hoạt động bằng cách thực hiện một số thao tác trên một giá trị. Nói chung giá trị này là số trước đó được tạo bởi trình tạo. Tuy nhiên, lần đầu tiên bạn sử dụng trình tạo, không có giá trị trước đó.

Việc tạo một bộ tạo số giả ngẫu nhiên mang lại cho nó giá trị "trước đó" đầu tiên. Mỗi giá trị hạt giống sẽ tương ứng với một chuỗi các giá trị được tạo cho một trình tạo số ngẫu nhiên nhất định. Đó là, nếu bạn cung cấp cùng một hạt giống hai lần, bạn sẽ nhận được cùng một chuỗi số hai lần.

Nói chung, bạn muốn chọn trình tạo số ngẫu nhiên của mình với một số giá trị sẽ thay đổi mỗi lần thực hiện chương trình. Ví dụ, thời gian hiện tại là một hạt giống được sử dụng thường xuyên. Lý do tại sao điều này không xảy ra tự động là vì nếu bạn muốn, bạn có thể cung cấp một hạt giống cụ thể để có được một chuỗi số đã biết.


39
Có thể điều đáng nói là đôi khi chúng ta muốn cung cấp hạt giống để cùng một chuỗi ngẫu nhiên được tạo ra trên mỗi lần chạy chương trình. Đôi khi, tính ngẫu nhiên trong (các) chương trình phần mềm được tránh để giữ cho hành vi của chương trình xác định và khả năng tái tạo các vấn đề / lỗi.
ViFI

1
Theo những gì @ViFI đã nói, việc xác định hành vi của chương trình (với một hạt giống cố định hoặc chuỗi hạt cố định) cũng có thể cho phép bạn đánh giá tốt hơn liệu một số thay đổi đối với chương trình của bạn có lợi hay không.
shaneb

bạn có thể giải thích với một số kịch bản thực tế cuộc sống. Tôi không thể hiểu một trường hợp sử dụng cho cùng. Chúng ta có một cái gì đó tương tự như vậy trong ngôn ngữ lập trình khác không?
Shashank Vivek

1
Đây là một kịch bản đời thực: stackoverflow.com/questions/5836335/ . Hạt ngẫu nhiên cũng phổ biến để tạo ra kết quả tái sản xuất cho nghiên cứu. Ví dụ: nếu bạn là nhà khoa học dữ liệu và bạn muốn công bố kết quả của mình với một loại mô hình sử dụng tính ngẫu nhiên (ví dụ: rừng ngẫu nhiên), bạn sẽ muốn đưa hạt giống vào mã được xuất bản của mình để mọi người có thể chắc chắn rằng tính toán được tái sản xuất.
Galen Long

89

Tất cả các câu trả lời khác dường như không giải thích việc sử dụng Random.seed (). Đây là một ví dụ đơn giản ( nguồn ):

import random
random.seed( 3 )
print "Random number with seed 3 : ", random.random() #will generate a random number 
#if you want to use the same random number once again in your program
random.seed( 3 )
random.random()   # same random number as before

33
>>> random.seed(9001)   
>>> random.randint(1, 10)  
1     
>>> random.seed(9001)     
>>> random.randint(1, 10)    
1           
>>> random.seed(9001)          
>>> random.randint(1, 10)                 
1                  
>>> random.seed(9001)         
>>> random.randint(1, 10)          
1     
>>> random.seed(9002)                
>>> random.randint(1, 10)             
3

Bạn thử cái này

Giả sử 'Random.seed' cung cấp một giá trị cho trình tạo giá trị ngẫu nhiên ('Random.randint ()') tạo ra các giá trị này trên cơ sở của hạt giống này. Một trong những tính chất bắt buộc của các số ngẫu nhiên là chúng phải được tái sản xuất. Khi bạn đặt cùng một hạt giống, bạn sẽ có được cùng một mẫu các số ngẫu nhiên. Bằng cách này, bạn đang tạo ra chúng ngay từ đầu. Bạn đưa ra một hạt giống khác - nó bắt đầu bằng một chữ cái đầu khác nhau (trên 3).

Cho một hạt giống, nó sẽ tạo ra các số ngẫu nhiên trong khoảng từ 1 đến 10 lần lượt. Vì vậy, bạn giả sử một bộ số cho một giá trị hạt giống.


15

Một số ngẫu nhiên được tạo ra bởi một số thao tác trên giá trị trước đó.

Nếu không có giá trị trước thì thời gian hiện tại là giá trị trước đó tự động. Chúng tôi có thể cung cấp giá trị trước đó bằng cách sử dụng riêng random.seed(x)ở đâu xcó thể là bất kỳ số hoặc chuỗi nào, v.v.

Do đó random.random()không thực sự là số ngẫu nhiên hoàn hảo, nó có thể được dự đoán thông qua random.seed(x).

import random 
random.seed(45)            #seed=45  
random.random()            #1st rand value=0.2718754143840908
0.2718754143840908  
random.random()            #2nd rand value=0.48802820785090784
0.48802820785090784  
random.seed(45)            # again reasign seed=45  
random.random()
0.2718754143840908         #matching with 1st rand value  
random.random()
0.48802820785090784        #matching with 2nd rand value

Do đó, việc tạo ra một số ngẫu nhiên không thực sự ngẫu nhiên, vì nó chạy trên các thuật toán. Các thuật toán luôn đưa ra cùng một đầu ra dựa trên cùng một đầu vào. Điều này có nghĩa, nó phụ thuộc vào giá trị của hạt giống. Vì vậy, để làm cho nó ngẫu nhiên hơn, thời gian được tự động gán cho seed().


11
Seed() can be used for later use ---

Example:
>>> import numpy as np
>>> np.random.seed(12)
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>
>>>
>>> np.random.seed(12) # When you use same seed as before you will get same random output as before
>>> np.random.rand(4)
array([0.15416284, 0.7400497 , 0.26331502, 0.53373939])
>>>
>>>
>>> np.random.seed(10)
>>> np.random.rand(4)
array([0.77132064, 0.02075195, 0.63364823, 0.74880388])
>>>

11
# Simple Python program to understand random.seed() importance

import random

random.seed(10)

for i in range(5):    
    print(random.randint(1, 100))

Thực hiện chương trình trên nhiều lần ...

Lần thử thứ 1: in 5 số nguyên ngẫu nhiên trong phạm vi 1 - 100

Lần thử thứ 2: in cùng 5 số ngẫu nhiên xuất hiện trong lần thực hiện trên.

Lần thử thứ 3: giống nhau

.....Sớm

Giải thích: Mỗi khi chúng tôi đang chạy chương trình trên, chúng tôi sẽ đặt seed thành 10, sau đó trình tạo ngẫu nhiên lấy điều này làm biến tham chiếu. Và sau đó bằng cách thực hiện một số công thức được xác định trước, nó tạo ra một số ngẫu nhiên.

Do đó, đặt hạt giống thành 10 trong lần thực hiện tiếp theo, đặt lại số tham chiếu thành 10 và một lần nữa hành vi tương tự bắt đầu ...

Ngay sau khi chúng tôi đặt lại giá trị hạt giống, nó cung cấp cho các nhà máy tương tự.

Lưu ý: Thay đổi giá trị hạt giống và chạy chương trình, bạn sẽ thấy một chuỗi ngẫu nhiên khác với chuỗi trước đó.


7

Trong trường hợp này, ngẫu nhiên thực sự là giả ngẫu nhiên. Cho một hạt giống, nó sẽ tạo ra các số có phân phối bằng nhau. Nhưng với cùng một hạt giống, nó sẽ tạo ra chuỗi số giống nhau mỗi lần. Nếu bạn muốn nó thay đổi, bạn sẽ phải thay đổi hạt giống của mình. Rất nhiều người thích tạo ra một hạt giống dựa trên thời gian hiện tại hoặc một cái gì đó.


6

Imho, nó được sử dụng để tạo ra kết quả khóa học ngẫu nhiên tương tự khi bạn sử dụng random.seed(samedigit)lại.

In [47]: random.randint(7,10)

Out[47]: 9


In [48]: random.randint(7,10)

Out[48]: 9


In [49]: random.randint(7,10)

Out[49]: 7


In [50]: random.randint(7,10)

Out[50]: 10


In [51]: random.seed(5)


In [52]: random.randint(7,10)

Out[52]: 9


In [53]: random.seed(5)


In [54]: random.randint(7,10)

Out[54]: 9

4

Đặt seed(x)trước khi tạo một bộ số ngẫu nhiên và sử dụng cùng một hạt giống để tạo cùng một bộ số ngẫu nhiên. Hữu ích trong trường hợp tái tạo các vấn đề.

>>> from random import *
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> seed(20)
>>> randint(1,100)
93
>>> randint(1,100)
88
>>> randint(1,100)
99
>>> 

3

Đây là sự hiểu biết của tôi. Mỗi lần chúng tôi đặt giá trị hạt giống, "nhãn" hoặc "tham chiếu" sẽ được tạo. Cuộc gọi Random.feft tiếp theo được đính kèm với "nhãn" này, vì vậy lần tới khi bạn gọi cùng giá trị hạt giống và Random.feft, nó sẽ cho bạn kết quả tương tự.

np.random.seed( 3 )
print(np.random.randn()) # output: 1.7886284734303186

np.random.seed( 3 )
print(np.random.rand()) # different function. output: 0.5507979025745755

np.random.seed( 5 )
print(np.random.rand()) # different seed value. output: 0.22199317108973948

1

Dưới đây là một thử nghiệm nhỏ chứng minh rằng việc cung cấp seed()phương thức với cùng một đối số sẽ gây ra kết quả giả ngẫu nhiên giống nhau:

# testing random.seed()

import random

def equalityCheck(l):
    state=None
    x=l[0]
    for i in l:
        if i!=x:
            state=False
            break
        else:
            state=True
    return state


l=[]

for i in range(1000):
    random.seed(10)
    l.append(random.random())

print "All elements in l are equal?",equalityCheck(l)

4
Kiểm tra bình đẳng ngắn hơn:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)trong python được sử dụng để khởi tạo trình tạo số giả ngẫu nhiên (PRNG) .

PRNG là thuật toán tạo ra chuỗi số xấp xỉ các thuộc tính của số ngẫu nhiên. Những số ngẫu nhiên này có thể được sao chép bằng cách sử dụng giá trị hạt giống . Vì vậy, nếu bạn cung cấp giá trị hạt giống, PRNG bắt đầu từ trạng thái bắt đầu tùy ý bằng cách sử dụng hạt giống.

Đối số a là giá trị hạt giống. Nếu một giá trị là None, theo mặc định, thời gian hệ thống hiện tại được sử dụng.

versionlà một số nguyên chỉ định cách chuyển đổi tham số thành số nguyên. Giá trị mặc định là 2.

import random
random.seed(9001)
random.randint(1, 10) #this gives output of 1
# 1

Nếu bạn muốn các số ngẫu nhiên tương tự để được sao chép sau đó cung cấp các hạt giống cùng một lần nữa

random.seed(9001)
random.randint(1, 10) # this will give the same output of 1
# 1

Nếu bạn không cung cấp hạt giống, thì nó sẽ tạo ra số lượng khác nhau chứ không phải 1 như trước đây

random.randint(1, 10) # this gives 7 without providing seed
# 7

Nếu bạn cung cấp hạt giống khác với trước đây , thì nó sẽ cung cấp cho bạn một số ngẫu nhiên khác nhau

random.seed(9002)
random.randint(1, 10) # this gives you 5 not 1
# 5

Vì vậy, tóm lại, nếu bạn muốn sao chép cùng một số ngẫu nhiên, hãy cung cấp hạt giống. Cụ thể, cùng một hạt giống .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.