Я не претендую на окончательное решение проблемы (или на то, что этот список является исчерпывающим), но я хочу обрисовать некоторые возможные подходы, которые приходят на ум и почему они будут работать или не будут работать. Я также не буду касаться таких вопросов, как то, является ли использование текущей временной метки в качестве источника случайности достаточно «непредсказуемым», и как применять определенные свойства распределения вероятностей - я просто сосредоточусь на том, чтобы избегать решений, использующих жесткое кодирование.
Не решение: явное запрещение жесткого кодирования
Это плохая идея. Это ненаблюдаемое требование (что означает, что вы не можете определить, удовлетворено ли оно, просто запустив программу), что настоятельно не рекомендуется в PPCG и может быть совершенно невозможно при запуске программы на любой другой платформе, где представления проверяются в автоматизированный способ Проблема с таким требованием заключается в том, что вам нужно начать с нахождения объективного определения «жесткого кодирования». В общем, если вы попробуете это, вы только ухудшите положение.
Сделать жесткое кодирование невозможным
Если вы не можете полностью запретить это, но не хотите, чтобы люди его использовали, тогда вы можете попытаться спроектировать проблему так, чтобы жесткое кодирование просто не было конкурентным подходом. Это возможно, если объекты, которые должны быть сгенерированы, являются достаточно большими и несжимаемыми, что для размещения одного примера в коде потребуется намного больше байтов, чем для написания алгоритма, который генерирует правильные решения случайным образом. В вашем конкретном примере это, конечно, не так, потому что матрицы идентичности допустимы и, как правило, их легко генерировать, но для других проблем это может быть не так. Если целевые объекты достаточно нерегулярны, просто потребуйте, чтобы они были большого размера, что, вероятно, не повлияет на количество байтов реального алгоритма, но взорвет жестко-закодированную часть.
Параметризация выхода
Часто эти проблемы связаны с одним или несколькими естественными параметрами, такими как размер матрицы в вашем примере. Если это так, сделать этот параметр входным может быть достаточно, чтобы сделать жесткое кодирование невозможным или, по крайней мере, нецелесообразным. В некоторых случаях может быть легко жестко закодировать одно конкретное решение для заданного значения параметра, которое было найдено вручную или с помощью расширенного поиска, но, возможно, не существует простой закрытой формы для экземпляра этого решения в целом, так что это не так Можно легко сгенерировать значение по умолчанию для произвольных входов. Опять же, это не относится к примеру, который вы упомянули, потому что единичная матрица работает с любым размером, но является оптимальным решением для этой связанной проблемы.обычно очень нерегулярный, поэтому невозможно иметь значение по умолчанию без активного поиска допустимых значений в любом случае. Вы можете объединить это с ограничением по времени, чтобы избежать грубого поиска значения по умолчанию.
Положить некоторые ограничение на распределение вероятностей
Если вы готовы отказаться от абсолютно неограниченного распределения вероятностей, вы можете наложить на него некоторые ограничения, которые все же дают ответчикам большую свободу в выборе их распределения, но которые затрудняют или делают невозможным жесткое кодирование:
- Самое простое ограничение, которое приходит на ум, - это требовать, чтобы разница между минимальной и максимальной вероятностью для любого возможного выхода была ниже определенного порога. Жестко закодированный подход, вероятно, будет иметь почти нулевые вероятности для почти всех выходов и вероятность, близкую к 1 для значения по умолчанию. Если вам требуется, чтобы максимальная разница была, например, ниже 0,1, то для обеспечения возможности захода на посадку потребуется 10 (случайно выбранных) значений по умолчанию. Точно так же вы могли бы просто потребовать минимальную вероятность для каждого возможного выхода, например, 1 / (2 * N *), где N - количество возможных выходов.
- В качестве альтернативы вы можете потребовать, чтобы в распределении не было (вероятностных) пробелов, чтобы не было интервала размера δ (выбранного вами) , так чтобы существовали как более высокие, так и более низкие вероятности. Это означает, что не может быть никаких отклонений с точки зрения вероятности, которые, вероятно, генерируются жестким кодированием.
Основная проблема этих подходов заключается в том, что о них гораздо сложнее рассуждать, доказать правильность ответов сложно, а экспериментальная проверка правильности может быть невозможна для больших выходных пространств. Тем не менее, они обеспечивают принципиально наблюдаемое требование для программы, которое может сделать невозможным жесткое кодирование.
Этим подходам может также потребоваться ограничение по времени, поскольку одним из способов увеличения вероятности значений, отличных от значений по умолчанию, будет попытка найти случайное foo несколько раз, прежде чем вернуться к значению по умолчанию.