| 

.NET C# Java Javascript Exception

2
Ich programmiere gerade ein kleines Programm, mit dem ich mit einen Freunden im LAN Pokern kann. Beim Pokern spielt der Zufall natürlich eine entscheidende Rolle.
Also, wie zufällig ist eine über Random generierte Zufallszahl. Reicht sie für mein kleines Programm aus? Und ab welcher Größe muss man vielleicht eine externe Bibliothek benutzen?
09.09.2009
casino_royal 41 1 2
Ich kenne mich mit der .net Implementation nicht aus. Aber normalerweise spielt die Zufaelligkeit eines Pseudozufallszahlengenerators nur dann eine Rolle, wenn man viele Zufallszahlen braucht. Was ist viel? Vielleicht 100'000, 1'000'000 oder mehr, ich weiss es nicht.
knivil 09.09.2009
4 Antworten
2
Im Prinzip garnicht. Randome ist ein PsydoZufallsGenerator mit einer Sekquenz von Zahlen und einem mathematischen Algorithmus wobei man den Seek (also den Startpunkt in der Sekquenz) definieren kann. Cryptografisch gesehen ist sollte Ranome nicht verwendet werden, jedoch ist es in den meißten anderen Anwendungsfällen ausreichen.

Das sagt die MSDN:
Stellt einen Generator für Pseudozufallszahlen dar, d. h. ein Gerät, das eine Zahlenfolge erzeugt, die bestimmte statistische Anforderungen hinsichtlich ihrer Zufälligkeit erfüllt.
(...)
Pseudozufallszahlen werden mit gleicher Wahrscheinlichkeit aus einer endlichen Menge von Zahlen ausgewählt. Die ausgewählten Zahlen sind nicht absolut zufällig, da bei ihrer Auswahl ein endlicher mathematischer Algorithmus verwendet wird, aber sie sind hinsichtlich praktischer Zwecke hinreichend zufällig.


Wenn du echte Zufallszahlen willst kannst du die Funktion RNGCryptoServiceProvider verwenden welche sich im System.Security.Cryptography Namespace finden läßt:

using System.Security.Cryptography;
(...)
/// <summary>
/// Erzeugt echte Zufallszahlen
/// </summary>
/// <param name="count">Anzahl der zu erzeugenden Zufallszahlen</param>
/// <returns>Gibt ein Array mit den erzeugten Zufallszahlen zurück</returns>
public static byte## GetRandomNumbers(int count) {
// Zufallszahlen erzeugen
RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
byte## numbers = new Byte#count#;
csp.GetBytes(numbers);
return numbers;
}
//Achtung: codekicker.de läßt eckicke Klammern in Antworttexten derzeit nicht zu.
//Ich hab Sie von daher durch # ersetzt.


"Kryptographie-Zufallszahlen-Generatoren erstellen kryptographisch starke Zufallswerte." Sagt die MSDN :D
09.09.2009
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Du kannst sie escapen ... \[ \]
knivil 09.09.2009
"Kryptographie-Zufallszahlen-Generatoren erstellen kryptographisch starke Zufallswerte." Danach ist aber leider nicht gefragt worden.
knivil 09.09.2009
2
Wenn du echte Zufallszahlen willst kannst du die Funktion RNGCryptoServiceProvider verwenden

Das ist nicht korrekt denn auch dort werden die "Zufallszahlen" berechnet.

Wirkliche Zufallszahlen basieren zB auf radiaktiven Zerfallsprozessen, atmosphärischem Rauschen, etc. Die Seite http://www.random.org/ bietet eine Möglichkeit auf echte Zufallszahlen zugreifen zu können.

Der Zufallsgenerator der in der Klasse Random verwendet wird basiert auf den Algorithmen des (genialen) Donald E. Knuth. Die Periodizität ist AFAIK > 1e12 was ausreichen sollte.

Die Güte eines RNG lässt sich zB einfach mit einem Streudiagramm testen. Dabei werden zufällige Abszissenwerte mit zufälligen Ordinatenwerten in Korrelation gebracht. Erscheint eine lineare Abhängigkeit zwischen beiden ist der RNG nich so zufällig wie vielleicht gewünscht.

Das 1. Bild zeigt Zufallszahlen des Lehmer-Algorithmus und das 2. Bild Zufallszahlen des Knuth-Algorithmus.
Es wurden Zufallszahlen im Intervall [0, 100) erzeugt und jeder gerade Index als Abszissenwert und ungerade Indizes als Ordinatenwerte.
Die Hyperebenen der "Zufallsfunktion" im Lehmer-Algorithmus sind deutlich erkennbar (für mich zumindest ;)).

09.09.2009
gfoidl 9,4k 3 5
gfoidl 9,4k 3 5
*Welcher* Knuth-Algorithmus soll das sein?
Das ist ja praktisch eine "2-tupel"-Korellation,
das sieht sehr schlecht aus.
vgl.: S. 20 in
http://ergodic.ugr.es/cphys/lecc/rn.pdf
Damengummistiefel 09.09.2009
Schaut schlecht aus ist aber Realität.
Donald E. Knuth: The art of computer programming, Band 2: Seminumerical Algorithms, 3. Ausgabe, Addison Weseley, 1998

Aber ich hab mich geirrt. Das Bild zeigt die Verwendung des Lehmer-Algorithmus.
gfoidl 09.09.2009
Hab die Antwort aktualisiert und den Fehler Knuth-Lehmer behoben.
gfoidl 09.09.2009
Ebend ;-) Habe damals Triplett- und Quadruplett-Korellation bis zu 3x10^9 auf Knuth laufen lassen, nix gefunden ..
Damengummistiefel 09.09.2009
1
Random verwendet als Startwert einen positiven int, also 31 bit. D.h. es gibt maximal 2 Milliarden mögliche Zahlenfolgen und damit könnte man mit genug beobachteten "Zufallsentscheidungen" den Startwert ermitteln.
Für Passwortgenerierung bedeutet das, dass es maximal 2 Mrd. Passwörter zu testen gibt.

Man könnte in einem Vorberechnungsschritt für jeden möglichen Startwert die ersten 1000 Zahlen generieren lassen und diese 2 Mrd. Zahlensequenzen zu 1000 Zahlen in eine indexierte Datenbank einfügen. Danach könnte man in sehr kurzer Zeit aus einigen beobachteten Zahlen/Karten die möglichen Startwerte rausfinden.
09.09.2009
Marvin Steppat 4,0k 1 4 8
Marvin Steppat 4,0k 1 4 8
0
Auf msdn gibt es einen Artikel zum Pseudozufallszahlengenerator von .NET. Ohne weiter ins Detail zu gehen verweist der Artikel darauf, das die Zufaelligkeit 'gewissen statistische Kriterien' erfuellt und nennt den Autor des Pdseudozufallszahlen-Algorithmus.

Es wird darauf verwiesen, dass die Zufallszahlenfolge vom 'seed' abhaengt, identische seeds fuehren zu identischen Folgen, und dass man als seed die aktuelle Systemzeit nehmen koenne.

Ich vermute, dass Random zum Pokern ausreicht. Bessere Zufallsfolgen werden eher in der Kryptographie benoetigt.
09.09.2009
Andreas_D 21 1

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH