我并没有声称对这个问题有最终的解决方案(或者此列表是详尽无遗的),但是我想概述一些想到的可能方法以及它们为什么会行不通。我还将不讨论切线问题,例如使用当前时间戳作为随机性源是否足够“不可预测”以及如何强制执行概率分布的某些属性-我将仅着眼于避免使用硬编码的解决方案。
不是解决方案:明确禁止硬编码
这是一个坏主意。这是一项不可观察的要求(这意味着您无法仅通过运行程序来确定它是否满足要求),在PPCG上强烈建议不要这样做,如果在其他平台上运行该程序并在此平台上验证了提交,则可能完全不可能。自动化的方式。这样的要求存在的问题是,您必须首先找到“硬编码”的客观定义。通常,如果您尝试这样做,只会使情况变得更糟。
使硬编码不可行
如果您不能完全禁止使用它,但又不想让人们使用它,那么您可以尝试设计挑战,以使硬编码根本不是一种竞争方法。如果应生成的对象足够大且不可压缩,以至于将一个示例放入代码中比编写一种随机生成有效解的算法所需的字节更多,那么这是可能的。在您的特定示例中,当然不是这种情况,因为身份矩阵是有效的并且通常易于生成,但是对于其他问题,情况可能并非如此。如果目标对象足够不规则,则仅要求它们具有较大的大小,这可能不会影响实际算法的字节数,但会炸毁硬编码部分。
参数化输出
通常,这些问题带有一个或多个自然参数,例如示例中矩阵的大小。如果是这样,则将该参数作为输入就足以使硬编码变得不可能或至少不切实际。在某些情况下,对于通过手动或通过广泛搜索找到的给定参数值,对某个特定解决方案进行硬编码可能很容易,但是对于这些解决方案的实例,可能没有简单的封闭形式,因此并非如此可以轻松地为任意输入生成默认值。同样,您提到的示例不是这种情况,因为单位矩阵可以在任何大小下工作,但对于此相关问题通常是高度不规则的,因此无论如何不主动搜索有效值就不可能拥有默认值。您可以将其与时间限制结合使用,以避免暴力搜索默认值。
把一些限制的概率分布
如果您愿意放弃一个完全不受限制的概率分布,则可以对其施加一些约束,这些约束仍然使答题者在选择其分布时具有很大的自由度,但是这使硬编码变得困难或不可能:
- 想到的最简单的约束是要求任何可能的输出的最小和最大概率之差低于某个阈值。硬编码方法对于几乎所有输出都可能具有几乎为零的概率,而对于默认值而言,其概率接近于1。如果您要求最大差值小于0.1(例如),则必须有10个(随机选择)默认值才能使方法成为一种选择。同样,对于每个可能的输出,您也可能只要求最小的概率,例如1 /(2 * N *),其中N是可能的输出数。
- 或者,您可以要求分布中不存在(似然性)缺口,因此不存在大小δ的间隔(由您选择),因此存在较高和较低的概率。这意味着就可能性而言,不可能有任何异常值,这些异常值可能是由硬编码方法生成的。
这些方法的主要问题在于,它们很难推理,很难证明答案的正确性,而且对于大的输出空间,通过实验验证正确性是不可能的。但是,它们为程序提供了一个原则上可以观察到的要求,这使得不可能进行硬编码。
这些方法可能还需要一个时间限制,因为增加非默认值的概率的一种方法是尝试多次找到随机的foo,然后再回到默认值。