Ich behaupte nicht, die ultimative Lösung für das Problem zu haben (oder dass diese Liste vollständig ist), aber ich möchte einige mögliche Ansätze skizzieren, die mir in den Sinn kommen und warum sie funktionieren würden oder nicht. Ich werde auch nicht auf tangentiale Probleme eingehen, wie die Frage, ob die Verwendung des aktuellen Zeitstempels als Zufallsquelle ausreichend "unvorhersehbar" ist und wie bestimmte Eigenschaften der Wahrscheinlichkeitsverteilung erzwungen werden können. Ich werde mich nur darauf konzentrieren, Lösungen zu vermeiden, die Hardcoding verwenden.
Keine Lösung: Festcodierung explizit nicht zulassen
Das ist eine schlechte Idee. Es ist eine nicht beobachtbare Anforderung (was bedeutet, dass Sie nicht feststellen können, ob sie nur durch Ausführen des Programms erfüllt ist), von der in PPCG dringend abgeraten wird und die möglicherweise völlig unmöglich ist, wenn das Programm auf einer anderen Plattform ausgeführt wird, auf der die Einreichungen in einem verifiziert werden automatisierte Weise. Das Problem bei einer solchen Anforderung ist, dass Sie zunächst eine objektive Definition für "Hardcodierung" finden müssen. Wenn Sie dies versuchen, werden Sie die Dinge im Allgemeinen nur noch schlimmer machen.
Mach Hard-Coding unmöglich
Wenn Sie es nicht vollständig verbieten können, aber nicht möchten, dass Benutzer es verwenden, können Sie versuchen, die Herausforderung so zu gestalten, dass Hardcodierung einfach kein wettbewerbsorientierter Ansatz ist. Dies ist möglich, wenn die Objekte, die generiert werden sollen, ausreichend groß und inkomprimierbar sind, sodass das Einfügen eines Beispiels in den Code viel mehr Bytes erfordert als das Schreiben eines Algorithmus, der zufällig gültige Lösungen generiert. In Ihrem speziellen Beispiel ist dies natürlich nicht der Fall, da Identitätsmatrizen gültig und im Allgemeinen leicht zu generieren sind. Bei anderen Problemen ist dies möglicherweise nicht der Fall. Wenn die Zielobjekte ausreichend unregelmäßig sind, müssen sie nur eine große Größe haben, was wahrscheinlich die Byteanzahl eines tatsächlichen Algorithmus nicht beeinflusst, aber den hartcodierten Teil in die Luft sprengt.
Ausgang parametrieren
Häufig hängen diese Probleme mit einem oder mehreren natürlichen Parametern zusammen, z. B. der Größe der Matrix in Ihrem Beispiel. In diesem Fall kann die Eingabe dieses Parameters ausreichen, um eine harte Codierung unmöglich oder zumindest unpraktisch zu machen. In einigen Fällen ist es möglicherweise einfach, eine bestimmte Lösung für einen bestimmten Parameterwert, der manuell oder über eine umfangreiche Suche gefunden wurde, fest zu codieren. Es gibt jedoch möglicherweise keine einfache geschlossene Form für eine Instanz dieser Lösung im Allgemeinen, sodass dies nicht der Fall ist leicht einen Standardwert für beliebige Eingaben zu generieren. Auch dies ist für das von Ihnen erwähnte Beispiel nicht der Fall, da die Identitätsmatrix in jeder Größe funktioniert, sondern eine optimale Lösung für dieses verwandte Problemist normalerweise sehr unregelmäßig, daher ist es nicht möglich, einen Standardwert zu haben, ohne aktiv nach gültigen Werten zu suchen. Sie können dies mit einem Zeitlimit kombinieren, um eine Brute-Force-Suche nach einem Standardwert zu vermeiden.
Legen Sie eine Beschränkung für die Wahrscheinlichkeitsverteilung
Wenn Sie bereit sind, auf eine völlig uneingeschränkte Wahrscheinlichkeitsverteilung zu verzichten, können Sie einige Einschränkungen festlegen, die den Antwortenden noch viel Freiheit bei der Auswahl ihrer Verteilung einräumen, die das Hardcodieren jedoch erschweren oder unmöglich machen:
- Die einfachste denkbare Einschränkung besteht darin, die Differenz zwischen minimaler und maximaler Wahrscheinlichkeit zu fordern, damit eine mögliche Ausgabe unter einem bestimmten Schwellenwert liegt. Ein hartcodierter Ansatz wird wahrscheinlich für fast alle Ausgaben Wahrscheinlichkeiten nahe Null und für den Standardwert eine Wahrscheinlichkeit nahe 1 haben. Wenn Sie eine maximale Differenz von weniger als 0,1 benötigen, müssten 10 (zufällig ausgewählte) Standardwerte verwendet werden, um die Annäherung zu einer Option zu machen. In ähnlicher Weise könnten Sie auch nur eine minimale Wahrscheinlichkeit für jede mögliche Ausgabe verlangen, z. B. 1 / (2 * N *), wobei N die Anzahl der möglichen Ausgaben ist.
- Alternativ können Sie verlangen, dass es keine (Wahrscheinlichkeits-) Lücken in der Verteilung gibt, so dass es kein (von Ihnen gewähltes) Intervall der Größe δ gibt, so dass sowohl höhere als auch niedrigere Wahrscheinlichkeiten existieren. Das bedeutet, dass es hinsichtlich der Wahrscheinlichkeit keine Ausreißer geben kann, die wahrscheinlich durch einen Hard-Coding-Ansatz erzeugt werden.
Das Hauptproblem bei diesen Ansätzen ist, dass es viel schwieriger ist, darüber nachzudenken, dass es schwierig ist, die Richtigkeit der Antworten zu beweisen, und das experimentelle Überprüfen der Richtigkeit kann für große Ausgaberäume unmöglich sein. Dennoch stellen sie eine grundsätzlich beobachtbare Anforderung an das Programm dar, die eine Hardcodierung unmöglich machen kann.
Diese Ansätze können auch eine zeitliche Begrenzung erfordern, da eine Möglichkeit zur Erhöhung der Wahrscheinlichkeit der Nicht-Standardwerte darin besteht, zu versuchen, ein zufälliges foo mehrmals zu finden, bevor auf den Standardwert zurückgegriffen wird.