Apa sebenarnya benih dalam generator angka acak?

21

Saya mencoba beberapa pencarian google biasa dll tetapi sebagian besar jawaban yang saya temukan agak ambigu atau bahasa / perpustakaan tertentu seperti Python atau C ++ stdlib.hdll. Saya mencari bahasa agnostik, jawaban matematis, bukan spesifik perpustakaan.

Sebagai contoh, banyak yang mengatakan bahwa benih adalah titik awal generator bilangan acak dan benih yang sama selalu menghasilkan bilangan acak yang sama. Apa artinya? Apakah itu berarti nomor output adalah fungsi deterministik dari benih tertentu, dan keacakan berasal dari nilai benih? Tetapi jika itu masalahnya, maka dengan memasok benih, bukankah kita, programmer, menciptakan keacakan alih-alih membiarkan mesin melakukannya?

Juga, apa artinya titik awal dalam konteks ini? Apakah ini cara yang tidak ketat untuk mengatakan elemen dari domain peta ? Atau ada yang salah? f : XYxXf:XY

Della
sumber
7
Saya merasa tidak memenuhi syarat untuk menulis jawaban, tetapi Anda mungkin menemukan artikel Wikipedia tentang Mersenne Twister mencerahkan, terutama bagian inisialisasi . Singkatnya, generator nomor pseudorandom seperti Mersenne Twister akhirnya akan mengulang hasilnya. Dalam kasus MT periode memiliki panjang 2^19937 − 1. Benih adalah titik dari urutan yang sangat panjang di mana generator mulai. Jadi ya, itu deterministik.
IonicSolutions
1
Generator nomor pseudo-acak adalah daftar nomor tetap yang berulang tanpa henti. Di mana itu dimulai? Anda bisa mengatakannya.
Whuber
2
@whuber Saya benar-benar berpikir komentar Anda akan menjadi jawaban yang bagus.
David Z

Jawaban:

22

Kebanyakan pseudo-random number generator (PRNGs) dibangun berdasarkan algoritma yang melibatkan beberapa jenis metode rekursif mulai dari nilai dasar yang ditentukan oleh input yang disebut "seed". PRNG default di sebagian besar perangkat lunak statistik (R, Python, Stata, dll.) Adalah algoritma Mersenne Twister MT19937, yang ditetapkan dalam Matsumoto dan Nishimura (1998) . Ini adalah algoritma yang rumit, jadi sebaiknya baca makalahnya jika Anda ingin tahu cara kerjanya secara detail. Dalam algoritme khusus ini, ada hubungan berulang derajat , dan seed input Anda adalah kumpulan awal vektor . Algoritme menggunakan hubungan perulangan linier yang menghasilkan:x 0 , x 1 , . . . , x n - 1nx0,x1,...,xn-1

xn+k=f(xk,xk+1,xk+m,r,SEBUAH),

di mana dan dan adalah objek yang dapat ditentukan sebagai parameter dalam algoritma. Karena seed memberikan set vektor awal (dan diberikan parameter tetap lainnya untuk algoritme), seri bilangan pseudo-acak yang dihasilkan oleh algoritma diperbaiki. Jika Anda mengubah seed maka Anda mengubah vektor awal, yang mengubah angka pseudo-acak yang dihasilkan oleh algoritma. Ini tentu saja fungsi benih.r1mnrSEBUAH

Sekarang, penting untuk dicatat bahwa ini hanyalah satu contoh, menggunakan algoritma MT19937. Ada banyak PRNG yang dapat digunakan dalam perangkat lunak statistik, dan masing-masing melibatkan metode rekursif yang berbeda, sehingga benih tersebut memiliki arti yang berbeda (dalam istilah teknis) di masing-masing. Anda dapat menemukan sebuah perpustakaan PRNGs untuk Rdi dokumentasi ini , yang berisi daftar algoritma yang tersedia dan surat-surat yang menggambarkan algoritma ini.

Tujuan dari seed adalah untuk memungkinkan pengguna untuk "mengunci" generator nomor pseudo-acak, untuk memungkinkan analisis yang dapat ditiru. Beberapa analis suka mengatur seed menggunakan true-number generator (TRNG) yang menggunakan input perangkat keras untuk menghasilkan nomor seed awal, dan kemudian melaporkannya sebagai nomor yang dikunci. Jika seed diset dan dilaporkan oleh pengguna asli maka auditor dapat mengulangi analisis dan mendapatkan urutan nomor pseudo-acak yang sama dengan pengguna asli. Jika seed tidak diset maka algoritma biasanya akan menggunakan beberapa seed default (mis., Dari jam sistem), dan umumnya tidak akan mungkin untuk mereplikasi pengacakan.

Pasang kembali Monica
sumber
+1. Akan lebih baik untuk menambahkan apa yang (biasanya) terjadi jika seseorang tidak secara eksplisit menyediakan benih.
Amoeba berkata Reinstate Monica
1
@amoeba: Paragraf 4 dari Jawaban saya, membahas ini secara singkat.
BruceET
1
Walaupun ini menjawab dasar-dasar dari pertanyaan. Tapi tidak menyentuh fakta mengapa kita membutuhkan ini dalam simulasi. Sangat sulit untuk menghasilkan keacakan yang BENAR - dan ketika Anda memilikinya Anda tidak dapat mereproduksi jawaban asli! Masukkan PNRG ... dengan semua masalahnya.
Paul Palmpje
@amoeba: Seperti yang diminta, saya telah menambahkan paragraf tambahan untuk menyempurnakan ini.
Pasang kembali Monica
1
Terima kasih. "Default seed" terdengar agak seperti selalu nilai default seed yang sama; yang saya maksudkan adalah bahwa biasanya seed diambil dari jam sistem. Ini menurut saya bagus untuk diketahui.
Amuba kata Reinstate Monica
16

Pertama, tidak ada keacakan benar di komputer saat ini menghasilkan "angka acak." Semua generator pseudorandom menggunakan metode deterministik. (Mungkin, komputer kuantum akan mengubahnya.)

Tugas yang sulit adalah membuat algoritma yang menghasilkan output yang tidak dapat dibedakan secara bermakna dari data yang berasal dari sumber yang benar-benar acak.

Anda benar bahwa pengaturan seed akan memulai Anda pada titik awal tertentu yang diketahui dalam daftar panjang nomor pseudorandom. Untuk generator yang diimplementasikan dalam R, Python, dan sebagainya, daftarnya sangat panjang. Cukup lama sehingga bahkan proyek simulasi layak yang terbesar tidak akan melebihi 'periode' generator sehingga nilai-nilai mulai siklus ulang.

Dalam banyak aplikasi biasa, orang tidak mengatur seed. Kemudian benih yang tidak dapat diprediksi diambil secara otomatis (misalnya, dari mikrodetik pada jam sistem operasi). Generator pseudorandom yang umum digunakan telah mengalami serangkaian uji, sebagian besar terdiri dari masalah yang terbukti sulit untuk disimulasikan dengan generator yang sebelumnya tidak memuaskan.

Biasanya, output generator terdiri dari nilai-nilai yang tidak, untuk tujuan praktis, dapat dibedakan dari angka yang dipilih secara acak dari distribusi seragam padaKemudian angka pseudorandom tersebut dimanipulasi sehingga cocok dengan apa yang akan diambil sampel secara acak dari distribusi lain seperti binomial, Poisson, normal, eksponensial, dll.(0,1).

Salah satu tes generator adalah untuk melihat apakah pasangan berturut-turut dalam 'pengamatan' disimulasikan sebagai benar-benar terlihat seperti mereka mengisi satuan persegi secara acak. (Dilakukan dua kali di bawah.) Penampilan yang agak bulat adalah hasil dari variabilitas yang melekat. Akan sangat mencurigakan untuk mendapatkan plot yang terlihat abu-abu seragam sempurna. [Pada beberapa resolusi, mungkin ada pola moire biasa; tolong ubah perbesaran ke atas atau ke bawah untuk menghilangkan efek palsu itu jika itu terjadi.]Unsayaf(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

masukkan deskripsi gambar di sini

Terkadang berguna untuk mengatur benih. Beberapa kegunaan tersebut adalah sebagai berikut:

  1. Ketika pemrograman dan debugging , nyaman untuk memiliki output yang dapat diprediksi. Begitu banyak programmer menaruh set.seedpernyataan di awal program sampai penulisan dan debugging selesai.

  2. Saat mengajar tentang simulasi. Jika saya ingin menunjukkan kepada siswa bahwa saya dapat mensimulasikan gulungan die fair menggunakan samplefungsi dalam R, saya bisa menipu, menjalankan banyak simulasi, dan memilih yang paling dekat dengan nilai teoritis target. Tetapi itu akan memberikan kesan yang tidak realistis tentang bagaimana simulasi benar-benar bekerja.

    Jika saya menetapkan seed di awal, simulasi akan mendapatkan hasil yang sama setiap kali. Siswa dapat mengoreksi salinan program saya untuk memastikan program itu memberikan hasil yang diinginkan. Kemudian mereka dapat menjalankan simulasi sendiri, baik dengan benih mereka sendiri atau dengan membiarkan program memilih tempat awal sendiri.

    Sebagai contoh, probabilitas mendapatkan total 10 saat menggulirkan dua dadu yang adil adalahDengan sejuta eksperimen 2-dadu saya harus mendapatkan akurasi sekitar dua atau tiga tempat. Margin kesalahan simulasi 95% adalah sekitar2

    3/36=1/12=0,08333333.
    2(1/12)(11/12)/106=0,00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. Saat berbagi analisis statistik yang melibatkan simulasi. Saat ini banyak analisis statistik melibatkan beberapa simulasi, misalnya tes permutasi atau sampler Gibbs. Dengan menunjukkan benih, Anda memungkinkan orang yang membaca analisis untuk mereplikasi hasil dengan tepat, jika mereka mau.

  4. Saat menulis artikel akademik yang melibatkan pengacakan. Artikel akademis biasanya melalui beberapa putaran tinjauan sejawat. Plot dapat menggunakan, misalnya, titik-titik yang dikocok secara acak untuk mengurangi plot berlebih. Jika analisis perlu sedikit diubah dalam menanggapi komentar pengulas, ada baiknya jika jittering yang tidak terkait tertentu tidak berubah di antara putaran ulasan, yang mungkin membingungkan bagi pengulas yang sangat rewel, jadi Anda menetapkan seed sebelum jittering.

BruceET
sumber
1
Sangat bagus, +1. Saya mengambil kebebasan untuk menambahkan poin keempat.
S. Kolassa - Reinstate Monica
Jadi maksud Anda generator nomor pseudorandrom pada dasarnya menyimpan urutan acak nomor acak (terdistribusi secara seragam dalam [0, 1]) dan sebuah seed hanya merupakan indeks urutan? Jadi apakah itu berarti angka acak yang dihasilkan adalah fungsi deterministik dari benih?
Della
9
Anda tidak perlu komputer kuantum untuk menggunakan fenomena kuantum untuk memiliki generator acak ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux
1
@Della. Anda pada dasarnya memiliki ide yang tepat. Tapi tolong mengerti bahwa dalam prakteknya 'periode' harus sangat besar. (Tidak peduli seberapa besar proyek simulasi Anda, Anda tidak ingin mengulanginya.) Misalnya, IonicSolutions berkomentar setelah Q bahwa generator Mersenne Twilster memiliki periode agak lebih besar daripada yang saya dapat dengan mudah memvisualisasikan. // Jika kamu tahu benihnya, kamu bisa menghasilkan pseudorandom seq dari sana. // Generator telah digunakan untuk mengenkripsi pesan. Tetapi standar untuk generator aman untuk enkripsi berbeda dari standar untuk generator untuk simulasi probabilitas. 219937-1,
BruceET
@Guiroux. Kemungkinan saya mencoba untuk menyebutkan komputer kuantum adalah untuk memiliki generator nomor acak benar secepat generator pseudorandom hari ini. Pada 1950-an sumber angka acak 'benar' digunakan untuk pengacakan dalam desain eksperimental dan untuk simulasi prob (lambat, terbatas). Mungkin melihat Juta Digit Acak .
BruceET
0

TL; DR;

Benih biasanya memungkinkan Anda untuk mereproduksi urutan angka acak. Dalam pengertian itu, mereka bukan bilangan acak benar, melainkan "bilangan acak semu", karenanya merupakan PNR Generator (PNRG). Ini adalah bantuan nyata dalam kehidupan nyata!

Sedikit lebih detail:

Hampir semua generator nomor "acak" yang diimplementasikan dalam bahasa komputer adalah generator nomor acak semu. Ini karena diberi nilai awal (===> seed) mereka akan selalu memberikan urutan hasil pseudo acak yang sama. Generator yang baik akan menghasilkan urutan yang tidak dapat dibedakan - dalam hal statistik - dari urutan acak yang benar (melempar dadu yang benar, koin yang benar, dll).

Dalam banyak kasus simulasi, Anda ingin memiliki pengalaman "acak" yang sebenarnya. Namun, Anda juga ingin dapat mereproduksi hasil Anda. Mengapa? Yah, setidaknya regulator tertarik pada hal aneh itu.

Ada banyak tempat untuk menyelam. Orang-orang bahkan melakukan analisis ke dalam benih acak "terbaik". Menurut pendapat saya ini membatalkan model mereka karena mereka tidak dapat menangani perilaku acak "benar" - atau PRNG mereka tidak cocok untuk implementasi mereka. Sebagian besar waktu mereka hanya tidak melakukan simulasi yang cukup - tetapi mereka membutuhkan waktu.

Sekarang bayangkan RNG "benar". Orang bisa menerapkan ini berdasarkan jenis keacakan dalam mesin. Jika Anda hanya mengambil seed acak (misal waktu sekarang), Anda membuat semacam titik awal acak tetapi keacakan urutan masih tergantung pada algoritma untuk menentukan angka berikutnya. Ini lebih penting daripada titik awal dalam banyak kasus karena distribusi hasil menentukan "hasil" yang sebenarnya. Jika urutan Anda harus benar-benar acak, bagaimana Anda menerapkannya? Kutu jam komputer dapat dikatakan deterministik dan jika tidak, mungkin akan menunjukkan banyak korelasi otomatis. Jadi apa yang bisa kamu lakukan? Taruhan terbaik sejauh ini adalah menerapkan PNRG yang solid.

Komputasi Quantum? Saya tidak yakin itu akan memperbaikinya.

Paul Palmpje
sumber