random.seed (): มันทำอะไร?


177

ฉันค่อนข้างสับสนกับสิ่งที่random.seed()เกิดขึ้นใน Python ตัวอย่างเช่นเหตุใดการทดลองด้านล่างจึงทำในสิ่งที่พวกเขาทำ (สม่ำเสมอ)

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

ฉันไม่พบเอกสารที่ดีเกี่ยวกับเรื่องนี้


30
การสร้างตัวเลขสุ่มไม่ใช่ "สุ่ม" อย่างแท้จริง มันเป็นที่กำหนดและลำดับมันสร้างเป็น dictated random.seedโดยค่าเมล็ดพันธุ์ที่คุณผ่านเข้าไป โดยทั่วไปคุณเพิ่งเรียกใช้random.seed()และใช้เวลาปัจจุบันเป็นค่าเมล็ดซึ่งหมายความว่าเมื่อใดก็ตามที่คุณเรียกใช้สคริปต์คุณจะได้รับลำดับที่แตกต่างกัน
ซาด Saeeduddin

3
ผ่านเมล็ดเดียวกันเพื่อสุ่มแล้วเรียกมันจะให้หมายเลขชุดเดียวกัน สิ่งนี้ใช้งานได้ตามที่ตั้งใจและหากคุณต้องการให้ผลลัพธ์แตกต่างกันทุกครั้งที่คุณต้องหว่านเมล็ดด้วยบางสิ่งที่แตกต่างกันทุกครั้งที่คุณเริ่มแอป (เช่นผลลัพธ์จาก / dev / สุ่มหรือเวลา)
Tymoteusz Paul

5
เมล็ดคือสิ่งที่ถูกป้อนไปยัง RNG เพื่อสร้างหมายเลขสุ่มแรก หลังจากนั้นพวกเขา RNG เป็นอาหารด้วยตนเอง คุณไม่เห็นคำตอบเดียวกันอย่างสม่ำเสมอเพราะสิ่งนี้ หากคุณเรียกใช้สคริปต์นี้อีกครั้งคุณจะได้รับหมายเลข "สุ่ม" ที่เหมือนกัน การตั้งค่าเมล็ดจะมีประโยชน์หากคุณต้องการสร้างผลลัพธ์เนื่องจากหมายเลข "สุ่ม" ทั้งหมดที่สร้างขึ้นจะเหมือนกันเสมอ
กะพริบ

เป็นมูลค่าการกล่าวขวัญ: ลำดับที่แสดงในโพสต์นี้ใน Python 2 Python 3 ให้ลำดับที่แตกต่างกัน
ggorlen

1
@Blink ใช้ "หมายเลขสุ่ม" ทำให้เข้าใจผิด RNG มีสถานะภายในที่ป้อนด้วยตนเอง จากสถานะภายในนี้จะได้รับเอาต์พุตสำหรับ randint (1,10) และการโทรอื่น ๆ หาก RNG กำลังป้อนข้อมูลจากเอาต์พุตของ randint (1,10) ลำดับจะยุบไปที่ 1 จากมากที่สุด 10 ลำดับและลำดับจะทำซ้ำหลังจากมากที่สุด 10 หมายเลข
Joachim Wagner

คำตอบ:


213

ตัวสร้างตัวเลขสุ่มหลอกทำงานโดยดำเนินการบางอย่างกับค่า โดยทั่วไปค่านี้เป็นหมายเลขก่อนหน้าที่สร้างโดยตัวสร้าง อย่างไรก็ตามครั้งแรกที่คุณใช้ตัวสร้างไม่มีค่าก่อนหน้า

การ seed ตัวสร้างตัวเลขสุ่มหลอกให้ค่า "ก่อนหน้า" เป็นครั้งแรก แต่ละค่าของเมล็ดจะสอดคล้องกับลำดับของค่าที่สร้างขึ้นสำหรับตัวสร้างตัวเลขสุ่มที่กำหนด นั่นคือถ้าคุณให้เมล็ดเดียวกันสองครั้งคุณจะได้รับหมายเลขลำดับเดียวกันสองครั้ง

โดยทั่วไปแล้วคุณต้องการ seed ตัวสร้างตัวเลขสุ่มของคุณด้วยค่าบางอย่างที่จะเปลี่ยนการดำเนินการของแต่ละโปรแกรม ตัวอย่างเช่นเวลาปัจจุบันเป็นเมล็ดที่ใช้บ่อย เหตุผลที่สิ่งนี้ไม่ได้เกิดขึ้นโดยอัตโนมัติคือถ้าคุณต้องการคุณสามารถระบุเมล็ดพันธุ์ที่เฉพาะเจาะจงเพื่อรับลำดับหมายเลขที่ทราบ


39
อาจเป็นสิ่งที่ควรกล่าวถึงในบางครั้งเราต้องการให้เมล็ดเพื่อให้มีการสุ่มลำดับเดียวกันในทุกการรันของโปรแกรม บางครั้งการหลีกเลี่ยงการสุ่มในโปรแกรมซอฟต์แวร์เพื่อรักษาพฤติกรรมของโปรแกรมและกำหนดความเป็นไปได้ของการทำซ้ำปัญหา / ข้อบกพร่อง
ViFI

1
การติดตามสิ่งที่ @ViFI พูดไว้การรักษาพฤติกรรมของโปรแกรมไว้ (ด้วยเมล็ดที่ตายตัวหรือลำดับของเมล็ดที่ตายตัว) สามารถช่วยให้คุณประเมินได้ดีขึ้นว่าการเปลี่ยนแปลงบางอย่างในโปรแกรมของคุณมีประโยชน์หรือไม่
shaneb

คุณอยากอธิบายให้กับสถานการณ์ชีวิตจริงบ้างไหม ฉันไม่เข้าใจกรณีการใช้งานสำหรับสิ่งเดียวกัน เรามีบางอย่างที่คล้ายกันในภาษาโปรแกรมอื่นหรือไม่
Shashank Vivek

1
นี่เป็นสถานการณ์ในชีวิตจริง: stackoverflow.com/questions/5836335/... เมล็ดสุ่มยังเป็นเรื่องธรรมดาในการสร้างผลลัพธ์ที่ทำซ้ำได้สำหรับการวิจัย ตัวอย่างเช่นหากคุณเป็นนักวิทยาศาสตร์ด้านข้อมูลและคุณต้องการเผยแพร่ผลลัพธ์ของคุณด้วยแบบจำลองบางประเภทที่ใช้การสุ่ม (เช่นฟอเรสต์แบบสุ่ม) คุณจะต้องรวมเมล็ดพันธุ์ในรหัสที่เผยแพร่ของคุณเพื่อให้ผู้คนมั่นใจได้ว่า การคำนวณจะทำซ้ำ
ยาว Galen

89

คำตอบอื่น ๆ ทั้งหมดดูเหมือนจะไม่อธิบายการใช้ random.seed () นี่คือตัวอย่างง่ายๆ (ที่มา ):

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

คุณลองสิ่งนี้

สมมติว่า 'random.seed' ให้ค่าแก่ตัวสร้างค่าสุ่ม ('random.randint ()') ซึ่งสร้างค่าเหล่านี้ตามพื้นฐานของเมล็ดนี้ หนึ่งในคุณสมบัติต้องของตัวเลขสุ่มคือพวกเขาควรจะทำซ้ำ เมื่อคุณใส่เมล็ดเดียวกันคุณจะได้ตัวเลขสุ่มที่เหมือนกัน วิธีนี้คุณจะสร้างพวกเขาได้ตั้งแต่เริ่มต้น คุณให้เมล็ดที่แตกต่างมันเริ่มต้นด้วยการเริ่มต้นที่แตกต่างกัน (สูงกว่า 3)

รับเมล็ดมันจะสร้างตัวเลขสุ่มระหว่าง 1 และ 10 หลังจากนั้นอีกหนึ่ง ดังนั้นคุณถือว่าหนึ่งชุดของตัวเลขสำหรับหนึ่งค่าเมล็ด


15

จำนวนสุ่มจะถูกสร้างขึ้นโดยการดำเนินการบางอย่างเกี่ยวกับค่าก่อนหน้านี้

หากไม่มีค่าก่อนหน้านี้แสดงว่าเวลาปัจจุบันเป็นค่าก่อนหน้าโดยอัตโนมัติ เราสามารถให้ค่าก่อนหน้านี้ด้วยตัวเองโดยใช้random.seed(x)ที่xอาจเป็นจำนวนใด ๆ หรือสตริง ฯลฯ

ดังนั้นไม่ได้จริงที่สมบูรณ์แบบจำนวนสุ่มมันอาจจะคาดการณ์ผ่านrandom.random()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

ดังนั้นการสร้างตัวเลขสุ่มจึงไม่ได้เป็นการสุ่มเพราะมันทำงานบนอัลกอริธึม อัลกอริทึมให้ผลลัพธ์เดียวกันเสมอตามอินพุตเดียวกัน ซึ่งหมายความว่ามันขึ้นอยู่กับมูลค่าของเมล็ด 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))

ดำเนินการโปรแกรมด้านบนหลาย ๆ ครั้ง ...

ความพยายามครั้งที่ 1: พิมพ์ 5 จำนวนเต็มแบบสุ่มในช่วง 1 - 100

ความพยายามครั้งที่สอง: พิมพ์หมายเลขสุ่ม 5 หมายเลขเดียวกันปรากฏในการทำงานข้างต้น

ความพยายามครั้งที่ 3: เหมือนกัน

..... เป็นต้น

คำอธิบาย: ทุกครั้งที่เราเรียกใช้โปรแกรมข้างต้นเราจะตั้งค่าเมล็ดเป็น 10 จากนั้นตัวสร้างแบบสุ่มจะใช้สิ่งนี้เป็นตัวแปรอ้างอิง และจากการทำสูตรที่กำหนดไว้ล่วงหน้ามันจะสร้างตัวเลขสุ่ม

ดังนั้นการตั้งค่า seed ที่ 10 ในการดำเนินการถัดไปอีกครั้งจะกำหนดหมายเลขอ้างอิงเป็น 10 และอีกครั้งพฤติกรรมเดียวกันเริ่มต้น ...

ทันทีที่เรารีเซ็ตค่าเมล็ดมันให้พืชเดียวกัน

หมายเหตุ: เปลี่ยนค่าเมล็ดและเรียกใช้โปรแกรมคุณจะเห็นลำดับสุ่มแตกต่างจากชุดก่อนหน้า


7

ในกรณีนี้การสุ่มคือการสุ่มหลอก รับเมล็ดมันจะสร้างตัวเลขที่มีการแจกแจงเท่ากัน แต่ด้วยเมล็ดเดียวกันมันจะสร้างหมายเลขลำดับเดียวกันทุกครั้ง หากคุณต้องการให้มันเปลี่ยนคุณจะต้องเปลี่ยนเมล็ดของคุณ ผู้คนจำนวนมากชอบที่จะสร้างเมล็ดพันธุ์ตามเวลาปัจจุบันหรือบางสิ่งบางอย่าง


6

Imho มันถูกใช้เพื่อสร้างผลการเรียนแบบสุ่มที่เหมือนกันเมื่อคุณใช้random.seed(samedigit)อีกครั้ง

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

ตั้งค่าseed(x)ก่อนที่จะสร้างชุดของตัวเลขสุ่มและใช้เมล็ดเดียวกันเพื่อสร้างชุดของตัวเลขสุ่มเดียวกัน มีประโยชน์ในกรณีของการทำซ้ำปัญหา

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

นี่คือความเข้าใจของฉัน ทุกครั้งที่เราตั้งค่าเมล็ดจะมีการสร้าง "ป้ายกำกับ" หรือ "อ้างอิง" การเรียกแบบสุ่มฟังก์ชันถัดไปจะแนบกับ "ป้ายกำกับ" นี้ดังนั้นในครั้งต่อไปที่คุณเรียกค่าเมล็ดเดียวกันและการสุ่มฟังก์ชันจะให้ผลลัพธ์เดียวกัน

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

นี่คือการทดสอบขนาดเล็กที่แสดงให้เห็นว่าการป้อนseed()วิธีการที่มีอาร์กิวเมนต์เดียวกันจะทำให้เกิดผลการหลอกหลอกแบบเดียวกัน:

# 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
การตรวจสอบความเท่าเทียมกันที่สั้นกว่า:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)ใน python ใช้เพื่อเริ่มต้นตัวสร้างตัวเลขสุ่ม (PRNG)(PRNG)

PRNG เป็นอัลกอริทึมที่สร้างลำดับของตัวเลขโดยประมาณคุณสมบัติของตัวเลขสุ่ม สุ่มตัวเลขเหล่านี้สามารถทำซ้ำใช้ค่าเมล็ดพันธุ์ ดังนั้นหากคุณระบุค่าของเมล็ดพันธุ์ PRNG จะเริ่มต้นจากสถานะเริ่มต้นโดยพลการโดยใช้เมล็ด

อาร์กิวเมนต์a คือค่าเมล็ด หากค่าคือNoneตามค่าเริ่มต้นระบบจะใช้เวลาปัจจุบัน

และversionเป็นเลขจำนวนเต็มที่ระบุวิธีแปลงพารามิเตอร์เป็นจำนวนเต็ม ค่าเริ่มต้นคือ 2

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

หากคุณต้องการให้หมายเลขสุ่มเดียวกันถูกสร้างซ้ำให้ระบุเมล็ดพันธุ์เดิมอีกครั้ง

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

หากคุณไม่ได้ระบุเมล็ดพันธุ์มันจะสร้างจำนวนที่แตกต่างกันและไม่ใช่ 1 เหมือนเดิม

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

หากคุณให้เมล็ดที่แตกต่างจากก่อนหน้านี้มันจะให้หมายเลขสุ่มที่แตกต่างกัน

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

ดังนั้นโดยสรุปหากคุณต้องการให้มีการสุ่มหมายเลขซ้ำกันให้จัดเตรียมเมล็ด โดยเฉพาะเมล็ดพันธุ์เดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.