Saya tidak mengklaim memiliki solusi akhir untuk masalah ini (atau bahwa daftar ini lengkap), tetapi saya ingin menguraikan beberapa pendekatan yang mungkin muncul dalam pikiran dan mengapa mereka mau atau tidak berhasil. Saya juga tidak akan membahas masalah tangensial seperti apakah menggunakan stempel waktu saat ini sebagai sumber keacakan cukup "tidak dapat diprediksi" dan bagaimana menegakkan properti tertentu dari distribusi probabilitas - saya hanya akan fokus pada menghindari solusi yang menggunakan hardcoding.
Bukan solusi: melarang hard-coding secara eksplisit
Ini ide yang buruk. Ini adalah persyaratan yang tidak dapat diobservasi (yang berarti Anda tidak dapat menentukan apakah itu puas hanya dengan menjalankan program), yang sangat tidak disarankan di PPCG dan mungkin sama sekali tidak mungkin jika menjalankan program pada platform lain, di mana pengiriman diverifikasi dalam suatu cara otomatis. Masalah dengan persyaratan seperti ini adalah Anda harus mulai dengan menemukan definisi objektif untuk "hard-coding". Secara umum, jika Anda mencoba ini, Anda hanya akan memperburuk keadaan.
Membuat hard-coding tidak mungkin
Jika Anda tidak dapat sepenuhnya melarangnya, tetapi Anda tidak ingin orang menggunakannya, maka Anda dapat mencoba merancang tantangan sedemikian rupa sehingga hard-coding sama sekali bukan pendekatan kompetitif. Ini dimungkinkan jika objek yang harus dihasilkan cukup besar dan tidak dapat dimampatkan sehingga memasukkan satu contoh ke dalam kode akan membutuhkan lebih banyak byte daripada menulis algoritma yang menghasilkan solusi yang valid secara acak. Dalam contoh spesifik Anda, tentu saja bukan itu masalahnya, karena matriks identitas valid dan umumnya mudah dibuat, tetapi untuk masalah lain, mungkin bukan itu masalahnya. Jika objek target cukup tidak beraturan, cukup minta mereka berukuran besar, yang mungkin tidak akan memengaruhi jumlah byte dari algoritma aktual tetapi akan meledakkan bagian hard-coded.
Parameterkan output
Seringkali, masalah ini datang dengan satu atau lebih parameter alami, seperti ukuran matriks pada contoh Anda. Jika demikian, menjadikan parameter itu input yang cukup untuk membuat hard-coding tidak mungkin atau setidaknya tidak praktis. Dalam beberapa kasus, mungkin sulit untuk membuat kode satu solusi spesifik untuk nilai parameter tertentu yang telah ditemukan secara manual atau melalui pencarian ekstensif, tetapi mungkin tidak ada formulir tertutup sederhana untuk instance dari solusi ini secara umum, jadi tidak mungkin untuk menghasilkan nilai default untuk input sewenang-wenang dengan mudah. Sekali lagi, ini bukan kasus untuk contoh yang Anda sebutkan, karena matriks identitas bekerja pada ukuran berapa pun, tetapi solusi optimal untuk masalah terkait inibiasanya sangat tidak teratur, jadi tidak mungkin untuk memiliki nilai default tanpa tetap mencari nilai yang valid. Anda dapat menggabungkan ini dengan batas waktu untuk menghindari pencarian brute force untuk nilai default.
Masukan beberapa pembatasan distribusi probabilitas
Jika Anda bersedia menyerahkan distribusi probabilitas yang sepenuhnya tidak dibatasi, Anda dapat menempatkan beberapa kendala padanya, yang masih memberi banyak kebebasan kepada penjawab dalam memilih distribusi mereka tetapi yang membuat hard-coding menjadi sulit atau tidak mungkin:
- Kendala paling sederhana yang muncul dalam pikiran adalah untuk memerlukan perbedaan antara probabilitas minimum dan maksimum untuk setiap output yang mungkin berada di bawah ambang tertentu. Pendekatan hard-code kemungkinan akan memiliki probabilitas hampir nol untuk hampir semua output dan probabilitas mendekati 1 untuk nilai default. Jika Anda memerlukan perbedaan maksimum di bawah 0,1 katakan, akan perlu ada 10 (nilai acak) untuk membuat pendekatan opsi. Demikian pula Anda juga bisa hanya memerlukan probabilitas minimum untuk setiap output yang mungkin, misalnya 1 / (2 * N *), di mana N adalah jumlah output yang mungkin.
- Sebagai alternatif, Anda dapat mensyaratkan bahwa tidak ada (kemungkinan) kesenjangan dalam distribusi, sehingga tidak ada interval ukuran δ (dipilih oleh Anda) sedemikian rupa sehingga ada probabilitas lebih tinggi dan lebih rendah. Itu berarti tidak mungkin ada outlier dalam hal kemungkinan, yang kemungkinan dihasilkan oleh pendekatan hard-coding.
Masalah utama dengan pendekatan ini adalah bahwa mereka jauh lebih sulit untuk dipikirkan, membuktikan kebenaran jawaban itu sulit, dan secara eksperimental memverifikasi kebenaran bisa mustahil untuk ruang output yang besar. Namun, mereka memberikan persyaratan yang pada dasarnya dapat diamati untuk program yang dapat membuat hardcoding tidak mungkin.
Pendekatan-pendekatan ini mungkin juga memerlukan batas waktu, karena salah satu cara untuk meningkatkan probabilitas nilai-nilai non-standar adalah dengan mencoba menemukan foo acak beberapa kali sebelum jatuh kembali ke nilai default.