Saya memiliki dua cara untuk menghasilkan daftar item dalam urutan acak dan ingin menentukan apakah mereka sama adil (tidak bias).
Metode pertama yang saya gunakan adalah untuk membangun seluruh daftar elemen dan kemudian melakukan pengocokan (katakanlah Fisher-Yates shuffle). Metode kedua lebih merupakan metode berulang yang membuat daftar terseret di setiap penyisipan. Dalam pseudo-code, fungsi penyisipan adalah:
insert( list, item )
list.append( item )
swap( list.random_item, list.last_item )
Saya tertarik pada bagaimana seseorang menunjukkan keadilan dari pengocokan khusus ini. Kelebihan dari algoritma ini, di mana digunakan, cukup bahwa meskipun sedikit tidak adil itu akan baik-baik saja. Untuk memutuskan saya perlu cara untuk mengevaluasi keadilannya.
Gagasan pertama saya adalah bahwa saya perlu menghitung permutasi total yang mungkin dengan cara ini versus total permutasi yang mungkin untuk satu set panjang akhir. Namun saya sedikit bingung bagaimana cara menghitung permutasi yang dihasilkan dari algoritma ini. Saya juga tidak dapat memastikan ini adalah pendekatan terbaik, atau termudah.
sumber
Jawaban:
Pertama, mari kita buat dua asumsi yang jelas, tetapi penting:
_.random_item
dapat memilih posisi terakhir._.random_item
memilih setiap posisi dengan probabilitas .Untuk membuktikan kebenaran algoritme Anda, Anda memerlukan argumen induktif yang mirip dengan yang digunakan di sini :
Dari sini, buktinya salah. Silakan lihat di bawah untuk bukti yang benar; Saya meninggalkan ini di sini karena kesalahan dan langkah-langkah berikut (yang masuk akal) mungkin mendidik.
Berguna untuk mendapatkan properti lokal (yaitu elemen-bijaksana) yang harus dimiliki, karena memperdebatkan seluruh permutasi adalah menyakitkan. Perhatikan bahwa permutasi dipilih secara seragam jika setiap elemen memiliki probabilitas yang sama untuk berada di setiap posisi, yaitu
dimana dan kami mengasumsikan demi kesederhanaan notasi yang kami masukkan { 1 , ... , n } ke dalam daftar.n = | L | { 1 , … , n }
Sekarang, mari kita lihat apa teknik Anda lakukan ketika memasukkan st elemen. Kami harus mempertimbangkan tiga kasus (setelah swap):n + 1
Untuk setiap kasus, kami menghitung probabilitas elemen berada pada posisi i ; semua harus berubah menjadi 1j saya (yang cukup karena(1)). Misalkanpn=11n + 1 ( 1 ) adalah probabilitas dari salah satu yang pertamanelemen berada di posisi dalam daftar tua (hipotesis induksi), danps=1haln= 1n n kemungkinan posisi apapun yang dipilih oleh(asumsi 1, 2). Perhatikan bahwa kutipan daftar dengannelemen dan memilih posisi swap adalahperistiwa independen, sehingga probabilitas faktor peristiwa gabungan, misalnyahals= 1n + 1 n
random_item
untuk . Sekarang untuk perhitungan.i , j ∈ { 1 , … , n }
Kami hanya mempertimbangkan elemen lama . Elemen j tersebut berada pada posisi i jika dan hanya jika ada sebelum penyisipan terakhir dan saya tidak dipilih sebagai posisi swap, yaitun j saya saya
.Pr( Lsaya= j ) = pn( 1 - hals) = 1n⋅ nn + 1= 1n + 1
Di sini kami menganggap bahwa salah satu elemen lama ditukar ke posisi terakhir. Elemen bisa berada di salah satu posisi lama, jadi kami menjumlahkan semua probabilitas bahwa j berada di posisi i dan saya dipilih sebagai posisi swap, yaituj j saya saya
.Pr( Ln + 1= j ) = ∑i = 1nhalnhals= ∑i = 1n1n⋅ 1n + 1= 1n + 1
Elemen baru berakhir di posisi jika dan hanya jika saya dipilih sebagai posisi swap, yaitusaya saya
.Pr( Lsaya= j ) = ps= 1n + 1
Semua ternyata baik-baik saja, strategi penyisipan Anda memang mempertahankan keseragaman. Dengan kekuatan induksi, itu membuktikan bahwa algoritma Anda menciptakan permutasi yang terdistribusi secara merata.
Sebuah kata peringatan: bukti ini rusak jika elemen yang dimasukkan tidak berbeda secara berpasangan. dapat dibedakan, karena persamaan pertama tidak lagi valid. Tetapi algoritma Anda masih valid; setiap permutasi dengan duplikat dihasilkan oleh jumlah eksekusi acak yang sama. Anda dapat membuktikan ini dengan menandai duplikat (yaitu membuatnya dapat dibedakan), melakukan bukti di atas dan menghapus tanda (secara virtual); langkah terakhir runtuh set permutasi berukuran sama dengan yang sama.
Seperti yang dikatakan Steven dengan benar dalam komentar, bukti di atas secara mendasar cacat karena tidak berlaku; Anda dapat membangun distribusi pada set permutasi yang memenuhi tangan kanan, tetapi tidak pada sisi kiri¹.( 1 )
random_item
random_item
yang harus kami tunjukkan. Dengan kekuatan induksi, itu membuktikan bahwa algoritma Anda menciptakan permutasi yang terdistribusi secara merata.
sumber