Генерация точного равномерного распределения всех головоломок судоку может быть выполнена следующим образом: вы можете просто случайным образом сгенерировать сетку 9x9, а затем сохранить ее, только если это правильная сетка судоку, в противном случае повторите попытку.
Такой подход грубой силы гарантирует вам равномерное распределение, но он явно не эффективен, поскольку вы можете умножить вероятность того, что сетка будет правильной, на только генерируя случайную сетку 8x8 и затем заполняя оставшиеся две строки. Это все еще случайное распределение, но все еще слишком неэффективное.917
Вы также можете заставить первую строку быть , затем случайным образом генерировать оставшуюся часть сетки и затем случайным образом выбрать перестановку всех цифр. Вы все равно выберете все сетки с той же вероятностью, но 9 ! Быстрее.[ 1 , 2 , . , 9 ]9 !
Возможно, вы понимаете, куда я иду: умный ответ на эту проблему, вероятно, заставит вас задуматься о лежащей в основе симметрии сеток судоку. В этом направлении была проделана большая работа, чтобы доказать тот факт, что 17 - это минимальное количество ключей к судоку ( см. Эту статью ), и вы можете перейти здесь, чтобы увидеть точное перечисление 5 472 730 538 классов из 3 359 232 похожих сеток, в которых используются эти симметрий:
- Перестановки цифр
- Перестановки строк (полосы и строки внутри каждой полосы)
- То же самое для столбцов
- перестановка
С помощью этого фреймворка вы можете случайным образом выбрать один из 5 472 730 538 классов (их можно сжать до 6 ГБ), а затем выбрать одного представителя для каждой симметрии, соответственно один из .9 ! , 64, 64, 2
РЕДАКТИРОВАТЬ: чтобы адаптировать это к неполным головоломкам, вы можете случайно выбрать подмножество вашей сетки, проверить, является ли решение уникальным с помощью решателя судоку, и повторите попытку, если нет. Это не является равномерным распределением, поскольку число неполных головоломок с уникальным решением может быть различным для двух сеток. (В противном случае я был бы очень удивлен)