Saya memiliki 400 bola, di mana 100 berwarna merah, 40 berwarna kuning, 50 berwarna hijau, 60 berwarna biru, 70 berwarna ungu, 80 berwarna hitam. (Bola dengan warna yang sama identik)
saya butuh algoritma pengocokan yang efisien, sehingga setelah pengocokan, bola ada dalam daftar, dan
3 bola berurutan tidak memiliki warna yang sama. misal, saya tidak bisa punya "merah, merah, merah, kuning ...."
Dan, semua permutasi "sama" kemungkinan terjadi. (well, jika pertukaran efisiensi dan ketidakberpihakan cukup baik, saya tidak keberatan efisiensi lebih dari ketidakberpihakan).
saya mencoba untuk beradaptasi Fisher-Yates-Knuth, tetapi hasilnya tidak ideal.
Mengapa Fisher-Yates tidak cukup baik? Ketika TA mengadopsi transformasi terbalik Monte Carlo. Dan distribusi output memperlakukan bola warna yang sama secara berbeda, yaitu akan menghasilkan hasil yang bias untuk kebutuhan saya.
Dan, pemikiran Naif adalah untuk menyaring / melacak semua permutasi buruk dari seluruh ruang. Ketika batasannya sangat kuat, katakanlah, jika kita hanya memiliki 300 bola dan 100 di antaranya berwarna merah, maka akan ada terlalu banyak pelacakan / kegagalan sebelum mendapatkan permutasi yang sesuai.
Jadi, pada akhirnya, saya ingin dapat mengulangi melalui semua permutasi yang baik. Namun, karena jumlah permutasi yang valid terlalu besar, saya hanya dapat mengambil sampel secara acak. Saya ingin fitur statistik "beberapa" dari mereka menyerupai populasi sebanyak mungkin.
sumber
Jawaban:
Pilih dua run secara acak. Jika Anda dapat menukarnya dan masih memiliki urutan hukum, lakukanlah.
Pilih dua putaran yang berdekatan. Jika Anda dapat menukarnya dan masih memiliki urutan hukum, lakukanlah.
Pilih dua run dengan warna yang sama. Mendistribusikan kembali bola di dalamnya secara acak di antara kemungkinan hukum (jadi jika jumlah bola maksimum dalam satu kali lari adalah 3, dan Anda memiliki total 5 bola dalam dua putaran yang dipilih, yang pertama kemungkinan sama akan mendapatkan 2 atau 3 bola; jika ada total 3 bola, yang pertama kemungkinan sama untuk mendapatkan 1 atau 2; jika ada total 4 bola, 1, 2, dan 3 semuanya sama-sama mungkin).
Jika analisis saya benar, ini adalah rantai Markov yang dapat dibalik yang pada akhirnya menyatu dengan distribusi seragam dari urutan bola berwarna, jadi jika Anda menjalankan rantai ini cukup lama, Anda akan menjadi sangat dekat dengan distribusi seragam ini.
(Demi kepentingan akurasi, izinkan saya mencatat bahwa kami meninggalkan sejumlah kontribusi untuk entropi, termasuk warna bola pertama, tetapi ini adalah istilah urutan yang lebih rendah yang harus aman untuk diabaikan.)
MEMPERBARUI:
Seharusnya ada cara mempercepat ini. Saya percaya bahwa untuk langkah c dan d, Anda dapat menggunakan analisis untuk melakukan kedua langkah ini di atas semua menjalankan satu warna sekaligus. Untuk langkah a dan b, ini setara dengan pertanyaan menemukan urutan acak bola berwarna dengan kendala yang tidak ada dua bola dengan sentuhan warna yang sama. Seharusnya ada cara yang baik untuk melakukan pencampuran untuk masalah ini. Maka Anda hanya perlu mengganti langkah-langkah a / b dengan langkah-langkah c / d, di mana setiap langkah mencampurkan kedua langkah itu sepenuhnya. Saya pikir ini harus menyatu cukup cepat, meskipun saya tidak memiliki analisis yang ketat untuk rantai Markov ini.
sumber
Seperti yang Anda katakan, tidak mungkin untuk memastikan bahwa setiap permutasi memiliki kemungkinan yang sama dan memastikan bahwa warna terdistribusi secara merata, karena salah satu permutasi memiliki semua merah dalam satu baris.
Metode yang sangat elegan, tetapi tentu saja tidak jelas, untuk memastikan warna didistribusikan secara merata adalah dengan memanfaatkan urutan perbedaan yang rendah.
Misalkan Anda memiliki bola, dinomori dari hingga , dan nilai seed, .N=400 1 N s
Pastikan semua bola dengan warna yang sama diberi nomor urut. Artinya, dalam kasus Anda, biarkan 100 bola pertama menjadi merah, 40 berikutnya menjadi kuning, 50 berikutnya hijau, dll.
Kemudian, alokasikan bola nilainya, sedemikian rupa sehingga: manakth xk
Artinya, masing-masing bola akan dialokasikan nilai yang akan selalu antara 0 dan 1.N xk
Sekarang cukup pesan bola, dalam urutan naik sesuai dengan nilai mereka .xk
Misalnya, menggunakan nilai seed , bola akan dipesan sebagai berikut:s=0
Akhirnya, jika Anda ingin mengambil sampel yang berbeda, cukup pilih nilai benih yang berbeda, .s
Kode python untuk alokasi ini adalah sebagai berikut:xk
sumber