Katakanlah saya ingin menghasilkan satu set angka acak dari interval (a, b)
. Urutan yang dihasilkan juga harus memiliki properti yang disortir. Saya dapat memikirkan dua cara untuk mencapai ini.
Membiarkan n
menjadi panjang urutan yang akan dihasilkan.
Algoritma 1:
Let `offset = floor((b - a) / n)`
for i = 1 up to n:
generate a random number r_i from (a, a+offset)
a = a + offset
add r_i to the sequence r
Algoritma 2:
for i = 1 up to n:
generate a random number s_i from (a, b)
add s_i to the sequence s
sort(r)
Pertanyaan saya adalah, apakah algoritma 1 menghasilkan urutan yang sebagus yang dihasilkan oleh algoritma 2?
random-generation
ultrajohn
sumber
sumber
R
. Dalam rangka untuk menghasilkan array set n angka acak pada interval seragam [ a , b ] , kode berikut bekerja: .rand_array <- replicate(k, sort(runif(n, a, b))
Jawaban:
Algoritma pertama gagal buruk karena dua alasan:
Mengambil lantai dapat menguranginya secara drastis. Memang, ketika b - a < n , itu akan nol, memberi Anda satu set yang nilainya sama!(a−b)/n b−a<n
Ketika Anda tidak mengambil lantai, nilai-nilai yang dihasilkan terlalu merata . Misalnya, dalam setiap sampel acak sederhana dari variasi seragam iid (katakanlah antara a = 0 dan b = 1 ), ada peluang ( 1 - 1 / n ) n ≈ 1 / e ≈ 37 % bahwa yang terbesar tidak akan dalam interval atas dari 1 - 1 / n ke 1 . Dengan algoritma 1, ada 100 %n a=0 b=1 (1−1/n)n≈1/e≈37% 1−1/n 1 100% kemungkinan maksimum akan berada dalam interval itu. Untuk beberapa tujuan, super-keseragaman ini baik, tetapi secara umum itu adalah kesalahan yang mengerikan karena (a) banyak statistik akan hancur tetapi (b) bisa sangat sulit untuk menentukan mengapa.
Jika Anda ingin menghindari penyortiran, sebagai gantinya buat varian terdistribusi eksponensial bebas. Normalisasi jumlah kumulatif mereka ke kisaran ( 0 , 1 ) dengan membaginya dengan jumlah. Jatuhkan nilai terbesar (yang akan selalu menjadi 1 ). Skala ulang ke kisaran ( a , b ) .n+1 (0,1) 1 (a,b)
Histogram dari ketiga algoritma ditampilkan. (Masing-masing menggambarkan hasil kumulatif dari set independen n = 100 nilai masing-masing.) Kurangnya variasi yang terlihat dalam histogram untuk Algoritma 1 menunjukkan masalah di sana. Variasi dalam dua algoritma lainnya persis seperti yang diharapkan - dan apa yang Anda butuhkan dari generator angka acak.1000 n=100
Untuk banyak lagi (menghibur) cara untuk mensimulasikan variasi seragam independen, lihat Mensimulasikan undian dari Distribusi Seragam menggunakan undian dari Distribusi Normal .
Berikut adalah
R
kode yang menghasilkan gambar.sumber
Algoritma pertama menghasilkan angka terlalu merata
Lihat juga seri perbedaan rendah .
(Seperti yang ditunjukkan, ini mungkin properti yang diinginkan misalnya untuk stratifikasi. Serangkaian perbedaan rendah seperti Halton dan Sobel memang memiliki kasus penggunaannya.)
Pendekatan yang tepat tetapi mahal (untuk nilai nyata)
... adalah menggunakan nomor acak yang didistribusikan beta. Statistik urutan peringkat dari distribusi seragam adalah beta. Anda dapat menggunakan ini untuk menggambar secara acak yang terkecil , lalu yang terkecil kedua, ... ulangi.
Yang menghasilkan algoritma berikut:
Mungkin ada ketidakstabilan numerik yang terlibat, dan komputasi
pow
dan pembagian untuk setiap objek mungkin ternyata lebih lambat daripada penyortiran.Untuk nilai integer Anda mungkin perlu menggunakan distribusi yang berbeda.
Penyortiran sangat murah, jadi gunakan saja
sumber
Ini juga tergantung pada apa yang Anda lakukan dengan angka acak. Untuk metode integrasi numerik masalah satu (ketika dikoreksi dengan melepaskan operator lantai) akan menghasilkan set titik superior. Apa yang Anda lakukan adalah suatu bentuk pengambilan sampel bertingkat dan memiliki keuntungan bahwa ia menghindari penggumpalan. misalnya, tidak mungkin mendapatkan semua nilai Anda dalam rentang 0 (ba) / n. Yang mengatakan untuk aplikasi lain ini bisa sangat buruk, itu tergantung pada apa yang ingin Anda lakukan dengannya.
sumber