Computer erstellen nicht aus dem Nichts Zufallszahlen ohne Basis, da Zeit höchstwahrscheinlich die universelle Basis für Zufälligkeit ist.
Ich möchte, dass Sie einen Code erstellen, der Zufallszahlen mit folgenden Regeln erstellt:
- Zeit darf zu keinem Zeitpunkt des Programms die Grundlage sein.
- Vordefinierte Zufalls- / Pseudozufallsfunktionen sind nicht zulässig.
- Die generierten Zahlen können in einem beliebigen Bereich liegen. Nun, mindestens zwei verschiedene ganze Zahlen: D.
- Zahlen werden wiedergegeben.
popularity-contest
Dadan
quelle
quelle
Antworten:
JavaScript
Das hat Spaß gemacht!
Ich habe den Mersenne Twister in JS geschrieben. Dann wurde mir klar, dass ich irgendwo einen Samen bekommen musste.
Also habe ich beschlossen, es von der Stack Exchange API zu bekommen! (Ich könnte
localStorage
einen Zähler verwenden und erhöhen, aber das macht keinen Spaß.) Also habe ich die 10 zuletzt aktiven Antworten abgerufen und dann alle 4 oder weniger aufeinander folgenden Ziffern in der Antwort genommen und sie addiert.Diese Seeds sind immer unterschiedlich, da der Stapelüberlauf ständig aktualisiert wird (und mein Kontingent weiter sinkt!). Die Zahlen umfassen Antwort-IDs, Fragen-IDs, Punktzahlen, Anzahl der Up- / Downvotes, Repräsentanten / IDs der Eigentümer und die Wrapper-Daten (Kontingent und dergleichen) ). Bei einem Lauf bekam ich
256845
dann270495
und dann256048
etc ....Dadurch werden 10 zufällige 32-Bit-Zweierkomplementzahlen in der Konsole protokolliert. Beispielausgabe:
quelle
Java
Die Magie liegt in der
public NoTimeRandom()
. In Strings gegossene Arrays können neue Programmierer verwirren, da die Zahlen zufällig sind. Probe (fürchar[]
:[C@4a8e91eb
). Dienext
Methode wird kopiert vonjava.util.Random
.Beispielausgabe:
Lassen Sie uns die Wirksamkeit dieses Rng testen:
In meiner Antwort auf Approximate a Bell Curve hängt die von mir verwendete Datengenerierung von einem guten Rng ab. Lassen Sie es uns als rng ausführen. Ausgabe:
Genau wie ich gedacht habe. Das ist eine ziemlich miese Sache.
quelle
C.
Kompilieren Sie mit dem Flag -pthread (oder was auch immer Ihr Compiler verwendet).
Ich bin mir nicht sicher, ob dies aufgrund des Standards "Zeit ist nicht zulässig" qualifiziert ist oder nicht, da der Scheduler im Grunde genommen als Entropiequelle verwendet wird, indem die Thread-Sicherheit absichtlich ignoriert wird. Es funktioniert mit einer ziemlich einfachen Pseudozufallsfunktion ( Lehmer-Zufallszahlengenerator ) mit einem hartcodierten Anfangssamen. Anschließend werden 20 Threads gestartet, die alle die Lehmer-Berechnung mit einem gemeinsamen Satz von Variablen ausführen.
Scheint ziemlich gut zu funktionieren, hier sind ein paar aufeinanderfolgende Läufe:
EDIT: Hab mir ein bisschen mehr Gedanken gemacht und festgestellt, dass dies überhaupt nicht zeitbasiert ist. Selbst mit einem vollständig deterministischen Scheduler kommt die Entropie nicht aus den Zeitscheiben, sondern aus dem Laden aller laufenden Prozesse auf dem System.
BEARBEITEN 2 Nachdem ich mich von @Quincunx inspirieren ließ, eine Glockenkurve zu veröffentlichen, habe ich 12 MB Zufälligkeit in eine Datei kopiert und auf CAcert hochgeladen . Es hat alle eingefleischten Tests nicht bestanden, aber beim HNO-Test respektable 7,999573 von 8 erreicht (nur potenziell deterministisch). Seltsamerweise machte es die Verdoppelung der Fadenzahl noch schlimmer.
quelle
C.
Es generiert eine Zufallszahl im Bereich von 0 bis 255, indem der Startwert von https://stackoverflow.com/questions verwendet wird
wget
.Probelauf:
quelle
C ++
Ausgabe
5 beliebige Zufallszahlen
drei Proben
quelle
11230576, 0, 11206992, 0, 2053725299
, die mir immer noch nicht zufällig erscheinen.Perl
Was ist das für ein Müll, wenn man Samen über das Internet bekommt? Klingt für mich nach Betrug ;-) Ich bevorzuge es, meinen Startwert stattdessen einer kryptografischen Hash-Funktion zu geben und eine Ausgabe im Bereich von 0 bis 2 ^ 160-1 wie folgt zu geben:
Immer wenn Sie eine Entropie von ungewisser Qualität haben, können Sie sie regelmäßiger verteilen (aber nicht verbessern!), Indem Sie sie in SHA1 oder MD5 oder so weiterleiten, wie ich es hier getan habe. Für Pre-Hash-Samen habe ich pid und die Adresse einer zufälligen Referenz verwendet. Sie können natürlich auch andere Eingaben für mehr Entropie hinzufügen, z. B. auf x86 können Sie TSC verwenden - (aber das Inlinen von Assembly-Code in Perl ist ein bisschen bärig, also habe ich ihn übersprungen).
Wenn Sie eine andere Ausgabe als der Typ auf dem nächsten Computer haben möchten, passen Sie einfach "some_salt" an, um eine Zeichenfolge zu werden, die Ihnen gefällt. Oder lassen Sie es ganz weg, wenn Sie ein Minimalist sind =)
quelle
Java
Meine Lösung Verletzungen
hashCode()
Methode derObject
Klasse.Beispielausgabe:
Motiviert durch andere Antworten, die die Zufälligkeit der Lösung demonstrieren, habe ich meine Lösung geändert, um die mittleren 16 Bits der
int
zurückgegebenen von zurückzugebenObject.hashCode()
.Ich habe eine 19-MB-Datei (bestehend aus 10 7
short
) erstellt und an CACert gesendet . Hier ist der Screenshot des Ergebnisses (es wurde bearbeitet, um gut auszusehen, aber die Zahlen bleiben unverändert):Ich war überrascht über das Ergebnis, da es beim Entropietest 7.999991 taktet und alle 7 Diehard-Tests (?) Besteht.
quelle
Javascript
Zufälliges Generieren mit der Mausbewegung des Benutzers
Die letzten fünf kopierten Daten:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
quelle
Bash, Bereich: Ints zwischen 0 und 1
quelle
echo -n & echo $!
werde es einfach tun, aber ein sehr schlechtes RNG sein. Sie können 2 auch mit einer anderen Zahl ändern, aber je größer die Zahl, desto schlechter wird die "Zufälligkeit".Rubin
Leider nur Mac. Wir
sox
ziehen Bytes aus dem Mikrofon (als String, ahem ...), kehren sie um, um den Status-Header am Ende zu erhalten (* hust *), zerhacken ihn, hacken den Header ab und nehmen das MD5 der Chunks , lassen Sie die nicht numerischen Zeichen aus dem Hash fallen, addieren Sie die verbleibenden größeren ganzen Zahlen, kleben Sie eine0.
auf die Vorderseite, konvertieren Sie sie in einen Float, fertig.Erzeugt Floats unterschiedlicher Länge im Intervall
0..1
.quelle
C.
Zufälliges Generieren mithilfe der Prozess-ID.
Beispielausgabe:
quelle
ROTIEREN
Wenn dies Code-Golf wäre , würde ich gewinnen!
quelle
Python
Pythons Prägnanz überrascht immer wieder. Da die Verwendung des zufälligen Bildes von imgur anscheinend nicht gültig ist, habe ich eine große Quelle der Zufälligkeit verwendet: den Chat von stackoverflow!
5 Versuche:
Nicht wirklich zufällig, aber keines davon ist es.
quelle
whatever.com/random
Perl
Ich habe viele Antworten gesehen, die HTTP-Anfragen stellten, was mir verschwenderisch erscheint, da unter der Decke Zufallszahlen auf dem Draht herumgereicht werden. Also habe ich beschlossen, einen Code zu schreiben, um einen auf einer niedrigeren Ebene zu wischen:
Gibt theoretisch zufällige Ports im Bereich 0..65535 an. In der Praxis gibt es eine Reihe von Ports, die Sie nie sehen werden, sodass die Verteilung alles andere als perfekt ist. Aber es ist AFAICT die minimale Menge an Arbeit, die Sie tun können, um Entropie von einem Remote-Host zu erhalten, bei dem ein Port geöffnet ist.
PS - Fehlerbehandlung bleibt dem Leser als Übung überlassen ;-)
quelle
C.
quelle