random.seed (): Apa fungsinya?


177

Saya agak bingung tentang apa yang random.seed()dilakukan dengan Python. Misalnya, mengapa uji coba di bawah ini melakukan apa yang mereka lakukan (secara konsisten)?

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

Saya tidak dapat menemukan dokumentasi yang bagus tentang ini.


30
Pembuatan angka acak tidak benar-benar "acak". Itu deterministik, dan urutan yang dihasilkannya ditentukan oleh nilai seed yang Anda masukkan random.seed. Biasanya Anda baru saja memohon random.seed(), dan ia menggunakan waktu saat ini sebagai nilai awal, yang berarti setiap kali Anda menjalankan skrip Anda akan mendapatkan urutan nilai yang berbeda.
Asad Saeeduddin

3
Melewati seed yang sama secara acak, dan kemudian memanggilnya akan memberi Anda set angka yang sama. Ini berfungsi sebagaimana mestinya, dan jika Anda ingin hasilnya berbeda setiap kali Anda harus menyemai dengan sesuatu yang berbeda setiap kali Anda memulai aplikasi (misalnya keluaran dari / dev / acak atau waktu)
Tymoteusz Paul

5
Benih adalah apa yang diumpankan ke RNG untuk menghasilkan angka acak pertama. Setelah itu, mereka RNG makan sendiri. Anda tidak melihat jawaban yang sama secara konsisten karena ini. Jika Anda menjalankan skrip ini lagi, Anda akan mendapatkan urutan nomor "acak" yang sama. Mengatur benih sangat membantu jika Anda ingin mereproduksi hasil, karena semua angka "acak" yang dihasilkan akan selalu sama.
Blink

Layak disebutkan: urutan yang ditunjukkan dalam posting ini adalah dalam Python 2. Python 3 memberikan urutan yang berbeda.
ggorlen

1
@Blink menggunakan "nomor acak" menyesatkan. RNG memiliki kondisi internal yang mandiri. Dari kondisi internal ini, output untuk randint (1,10) dan panggilan lainnya diturunkan. Jika RNG diumpankan dari output randint (1,10) urutannya akan runtuh ke 1 dari paling banyak 10 urutan dan urutan akan diulang setelah paling banyak 10 angka.
Joachim Wagner

Jawaban:


213

Generator angka pseudo-acak bekerja dengan melakukan beberapa operasi pada suatu nilai. Secara umum nilai ini adalah angka sebelumnya yang dihasilkan oleh generator. Namun, saat pertama kali Anda menggunakan generator, tidak ada nilai sebelumnya.

Menyemai generator angka pseudo-acak memberinya nilai "sebelumnya" yang pertama. Setiap nilai benih akan sesuai dengan urutan nilai yang dihasilkan untuk generator angka acak tertentu. Artinya, jika Anda memberikan benih yang sama dua kali, Anda mendapatkan urutan angka yang sama dua kali.

Secara umum, Anda ingin menyemai generator nomor acak Anda dengan beberapa nilai yang akan mengubah setiap eksekusi program. Misalnya, waktu saat ini adalah benih yang sering digunakan. Alasan mengapa hal ini tidak terjadi secara otomatis adalah agar jika Anda mau, Anda dapat memberikan seed tertentu untuk mendapatkan urutan angka yang diketahui.


39
Mungkin perlu disebutkan bahwa kadang-kadang kita ingin memberikan seed sehingga urutan acak yang sama dihasilkan pada setiap program. Terkadang, keacakan dalam program perangkat lunak dihindari untuk menjaga perilaku program tetap dan kemungkinan mereproduksi masalah / bug.
ViFI

1
Mengikuti apa yang dikatakan @ViFI, menjaga deterministik perilaku program (dengan benih tetap, atau urutan benih tetap) juga dapat memungkinkan Anda menilai dengan lebih baik apakah beberapa perubahan pada program Anda bermanfaat atau tidak.
shaneb

maukah Anda menjelaskan dengan beberapa skenario kehidupan nyata. Saya tidak mengerti kasus penggunaan untuk hal yang sama. Apakah kita memiliki sesuatu yang mirip dengan ini dalam bahasa pemrograman lain juga?
Shashank Vivek

1
Berikut ini skenario nyata: stackoverflow.com/questions/5836335/… . Benih acak juga umum untuk menciptakan hasil yang dapat direproduksi untuk penelitian. Misalnya, jika Anda seorang ilmuwan data dan Anda ingin mempublikasikan hasil Anda dengan beberapa jenis model yang menggunakan keacakan (misalnya hutan acak), Anda akan ingin memasukkan benih dalam kode Anda yang diterbitkan sehingga orang dapat memastikan Anda perhitungan dapat direproduksi.
Galen Long

89

Semua jawaban lain tampaknya tidak menjelaskan penggunaan random.seed (). Berikut ini adalah contoh sederhana ( sumber ):

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

Kamu coba ini.

Katakanlah 'random.seed' memberikan nilai ke penghasil nilai acak ('random.randint ()') yang menghasilkan nilai-nilai ini berdasarkan benih ini. Salah satu sifat must dari angka acak adalah mereka harus dapat direproduksi. Saat Anda meletakkan seed yang sama, Anda mendapatkan pola angka acak yang sama. Dengan cara ini Anda menghasilkan mereka sejak awal. Anda memberikan seed yang berbeda-itu dimulai dengan inisial yang berbeda (di atas 3).

Diberikan seed, itu akan menghasilkan angka acak antara 1 dan 10 satu demi satu. Jadi Anda mengasumsikan satu set angka untuk satu nilai seed.


15

Angka acak dihasilkan oleh beberapa operasi pada nilai sebelumnya.

Jika tidak ada nilai sebelumnya maka waktu saat ini sebagai nilai sebelumnya secara otomatis. Kami dapat memberikan nilai sebelumnya ini dengan menggunakan sendiri di random.seed(x)mana xbisa berupa angka atau string dll.

Karenanya random.random()sebenarnya bukan angka acak yang sempurna, bisa diprediksi via 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

Oleh karena itu, menghasilkan angka acak sebenarnya tidak acak, karena ini berjalan pada algoritma. Algoritma selalu memberikan output yang sama berdasarkan input yang sama. Ini berarti, itu tergantung pada nilai benih. Jadi, agar lebih acak, waktu secara otomatis ditetapkan 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))

Jalankan program di atas beberapa kali ...

Upaya pertama: mencetak 5 bilangan bulat acak dalam kisaran 1 - 100

Upaya 2: mencetak 5 angka acak yang sama muncul dalam eksekusi di atas.

Upaya ke-3: sama

..... Terus

Penjelasan: Setiap kali kita menjalankan program di atas kita mengatur seed ke 10, maka generator acak mengambil ini sebagai variabel referensi. Dan kemudian dengan melakukan beberapa formula yang telah ditentukan, itu menghasilkan angka acak.

Karenanya pengaturan seed ke 10 dalam eksekusi berikutnya lagi menetapkan nomor referensi ke 10 dan lagi perilaku yang sama dimulai ...

Segera setelah kami mereset nilai benih, hasilnya memberikan tanaman yang sama.

Catatan: Ubah nilai seed dan jalankan program, Anda akan melihat urutan acak yang berbeda dari yang sebelumnya.


7

Dalam hal ini, acak sebenarnya adalah pseudo-acak. Diberikan seed, itu akan menghasilkan angka dengan distribusi yang sama. Tetapi dengan seed yang sama, itu akan menghasilkan urutan nomor yang sama setiap kali. Jika Anda ingin itu berubah, Anda harus mengubah benih Anda. Banyak orang suka menghasilkan benih berdasarkan waktu saat ini atau sesuatu.


6

Imho, ini digunakan untuk menghasilkan hasil kursus acak yang sama ketika Anda menggunakannya random.seed(samedigit)lagi.

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

Setel seed(x)sebelum membuat set angka acak dan gunakan seed yang sama untuk menghasilkan set angka acak yang sama. Berguna dalam hal mereproduksi masalah.

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

Inilah pengertian saya. Setiap kali kita menetapkan nilai seed, "label" atau "referensi" dihasilkan. Panggilan fungsi random.fungsi berikutnya dilampirkan pada "label" ini, jadi lain kali Anda memanggil nilai seed yang sama dan fungsi random.fungsi, ia akan memberi Anda hasil yang sama.

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

Berikut ini adalah tes kecil yang menunjukkan bahwa memberi makan seed()metode dengan argumen yang sama akan menyebabkan hasil pseudo-acak yang sama:

# 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
Pemeriksaan kesetaraan yang lebih singkat:len(set(l))<=1
Oliver Ni

0

random.seed(a, version)di python digunakan untuk menginisialisasi pseudo-random number generator (PRNG) .

PRNG adalah algoritma yang menghasilkan urutan angka yang mendekati sifat-sifat angka acak. Angka acak ini dapat direproduksi menggunakan nilai seed . Jadi, jika Anda memberikan nilai seed, PRNG mulai dari status awal yang arbitrer menggunakan seed.

Argumen a adalah nilai benih. Jika nilainya aNone , maka secara default, waktu sistem saat ini digunakan.

dan versionbilangan bulat yang menentukan cara mengubah parameter menjadi bilangan bulat. Nilai default adalah 2.

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

Jika Anda ingin nomor acak yang sama direproduksi kemudian berikan benih yang sama lagi

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

Jika Anda tidak menyediakan seed, maka menghasilkan angka yang berbeda dan bukan 1 seperti sebelumnya

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

Jika Anda memberikan benih berbeda dari sebelumnya , maka itu akan memberi Anda nomor acak yang berbeda

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

Jadi, secara ringkas, jika Anda ingin nomor acak yang sama direproduksi, berikan benih. Secara khusus, benih yang sama .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.