Zufallszahlengeneratoren hängen von einem guten Seed ab, um echte Zufallszahlen bereitzustellen. Eine Quelle für guten Samen ist die Eingabe des Benutzers, da menschliches Verhalten nicht deterministisch ist.Benutzereingabe zum Erstellen von Seed für Zufallsgenerierung
Eine Möglichkeit, dies zu tun, besteht darin, dass der Benutzer einige Zeichen eingeben und die Zeit zwischen den Tastenanschlägen messen kann. Hier einige Code, um dies zu veranschaulichen:
Console.WriteLine("please enter some text (at least 10 characters)");
DateTime startDateTime = DateTime.Now;
List<double> timeStamps = new List<double>();
ConsoleKeyInfo cki;
int cnt = 0;
do
{
cki = Console.ReadKey();
double timeStamp = DateTime.Now.Subtract(startDateTime).TotalMilliseconds;
timeStamps.Add(timeStamp);
cnt++;
}
while ((cki.Key != ConsoleKey.Enter) || (cnt<3));
Console.WriteLine();
Der obige Code misst die Zeit bertween den Schlüsselspeicher, die in Array zeitstempelt gespeichert werden.
Mit Hilfe dieser Daten von Menschen, die einen Samen wie folgt berechnen:
double sum = timeStamps.Sum(v => v * 20);
int seed = Convert.ToInt32(sum);
Console.WriteLine($"seed: {seed}");
Und dann können wir berechnen, echte Zufallszahlen:
Console.WriteLine("5 random values:");
Random rnd = new Random(seed);
for(int i=0;i<5;i++)
{
int n = rnd.Next(100, 200);
Console.WriteLine(n);
}
ich Ihnen Meinung interessiert bin und deine Gedanken zu mein Ansatz. Interessanterweise habe ich noch nie eine solche Lösung im Internet gesehen.
_ "Es ist wohlbekannt, dass Zufallszahlengeneratoren von einem guten Seed abhängen, um echte Zufallszahlen zu liefern" _ - baloney. Woher hast du diese Idee? Eine gute PRNG wird "echte" Zufallszahlen für _any_ seed erzeugen (dh "real" wie in richtig verteilt ... die einzige Möglichkeit, ** echte ** Zufallszahlen zu erhalten, ist die Verwendung eines tatsächlichen zufälligen Prozesses, um sie zu generieren, nicht a Pseudozufallszahlengenerator, wie die 'Random' Klasse, wie sie in Programmiergerüsten gefunden wird. –
Wie oben für Ihren Code erwähnt, ist die Verwendung des menschlichen Eingabetimings ein gängiger Ansatz zum Generieren von Zufallszahlen, nicht von Seeds. Zum Beispiel haben elektronische Spielautomaten (z. B. Spielautomaten, Pokerspiele usw.) oft einen PRNG, der kontinuierlich läuft, wobei Benutzereingabe bewirkt, dass eine Zufallszahl basierend auf dem aktuellen Zustand des kontinuierlich laufenden PRNG ausgewählt wird. Ihre Idee ist bei weitem nicht neu und Stack Overflow ist in keinem Fall dazu geeignet, eine allgemeine Diskussion darüber zu führen. –