2017-06-10 6 views
-4

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.

+1

_ "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. –

+0

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. –

Antwort

-1

Actualle I thnk Sie missverstehen die Konzepte ein bisschen.

Sie regregieren Pseudozufallszahlengeneratoren. Diese basieren auf Funktionen, die Zufallszahlen erzeugen, wobei jede zurückgegebene Zahl aus der vorherigen zurückgegebenen Zahl berechnet wird. Wenn Sie die erste Nummer kennen, erhalten Sie die exakte gleiche Sequenz jedes Mal. Die Ausgabe sieht zufällig aus und ist für Mähnezwecke ausreichend zufällig. Wenn Sie eine bekannte Sequenz verwenden, können Sie auch einen Test für spezifisches Verhalten schreiben, da Sie die zufälligen Zahlen für jeden Testlauf reproduzieren können. Es ist im Grunde ein bekanntes Muster oder eine Folge von Zahlen.

Aber angenommen, die Ausgabe ist kryptographisch sicher Zufälligkeit ist nicht sicher. Erzeuge keine Geheimnisse mit Pseudozufallszahlen. Erzeuge keine Geheimnisse mit Pseudozufallszahlen.

Die meisten Sprachen haben Module zum Erstellen echter Zufallszahlen. (in. NET wäre es der CryptoRandomProvider). Diese Klassen verwenden echte Entropie-ähnliche Kombinationen von Netzwerkpaketen, Eingaben auf Maus und Tastatur, Suchvorgänge auf der Festplatte und was nicht wirklich zufällige Zahlen erzeugt. Unter Linux hätten Sie Zugriff auf das Lesen von/dev/random enthält wirklich zufällige Bytes, kann aber auch erschöpft sein.