Saya membuat game yang menghadirkan sejumlah jenis puzzle secara berurutan. Saya memilih setiap teka-teki dengan nomor pseudorandom. Untuk setiap teka-teki, ada sejumlah variasi. Saya memilih variasi dengan nomor pseudorandom lain. Dan seterusnya.
Masalahnya adalah, sementara ini menghasilkan keacakan hampir-benar, ini bukan apa yang benar-benar diinginkan pemain. Pemain biasanya menginginkan apa yang mereka anggap sebagai dan mengidentifikasi secara acak, tetapi hanya jika tidak cenderung mengulangi teka-teki. Jadi, tidak terlalu acak. Tidak dapat diprediksi.
Setelah memikirkannya, saya bisa membayangkan cara-cara aneh melakukannya. Misalnya, untuk sementara waktu menghilangkan pilihan N terbaru dari serangkaian kemungkinan saat memilih pilihan baru. Atau menetapkan setiap pilihan dengan probabilitas yang sama, mengurangi probabilitas pilihan menjadi nol pada pilihan, dan kemudian meningkatkan semua probabilitas secara perlahan dengan setiap pilihan.
Saya berasumsi ada cara yang mapan untuk melakukan ini, tetapi saya tidak tahu terminologi sehingga saya tidak dapat menemukannya. Adakah yang tahu Atau adakah yang memecahkan ini dengan cara yang menyenangkan?
Jawaban:
Jika Anda memiliki jumlah teka-teki yang terbatas, Anda dapat:
EDIT
Saya tidak tahu ini, tetapi browsing SE membuat saya menyadari bahwa ini sebenarnya dikenal sebagai "tas acak". Beberapa info lebih lanjut di sini , di sini atau di sana .
EDIT 2
Knuth Shuffle klasik berjalan seperti ini:
Steven Stadnicki dengan tepat menunjukkan dalam komentarnya bahwa hal semacam ini tidak mencegah pengulangan pada perombakan. Cara untuk memperhitungkan ini adalah dengan menambahkan case khusus untuk item terakhir:
sumber
Varian pada pendekatan lorancou: untuk setiap jenis puzzle, simpan satu array nomor puzzle (dikocok); lalu setiap kali Anda menekan puzzle jenis itu, dapatkan nomor berikutnya dari daftar. misalnya, misalkan Anda memiliki teka-teki Sudoku, Picross, dan Kenken, masing-masing dengan teka-teki # 1..6. Anda akan membuat tiga array acak dari angka 1..6, satu untuk setiap jenis puzzle:
Sekarang, Anda akan mengocok jenis puzzle seperti yang disarankan lorancu; katakanlah itu muncul [Picross, Sudoku, Kenken]. Kemudian setiap kali Anda menekan puzzle dari jenis yang diberikan, gunakan angka berikutnya dalam 'daftar acak'; keseluruhan presentasi puzzle Anda adalah [Sudoku # 5, Picross # 6, Kenken # 3, Sudoku # 6, Picross # 2, Kenken # 2, ...]
Jika Anda tidak ingin menyimpan puzzle dalam urutan keseluruhan yang sama setiap kali melalui loop, maka saya pikir Anda memilih secara acak, mengabaikan pilihan picks terakhir adalah yang terbaik. Ada beberapa cara Anda dapat membuat ini sedikit lebih efisien juga; misalnya, katakanlah Anda memiliki 20 hal dan Anda ingin mengabaikan 5 pilihan terakhir. Kemudian alih-alih secara acak memilih angka 1..20 dan 'rerolling' sampai Anda mendapatkan satu di luar 5 terakhir, alih-alih hanya memilih nomor 1..15 dan berjalan melalui jenis puzzle Anda yang banyak langkah, hanya melompati setiap jenis puzzle yang telah dipilih (Anda dapat melakukan ini dengan mudah dengan menjaga sedikit array yang menampung 5 teka-teki yang dipilih terakhir).
sumber