Was macht Random wirklich Random?

dozerv8

Enthusiast
Thread Starter
Mitglied seit
25.11.2007
Beiträge
36
Hi Leute!

Viele Programmiersprachen beinhalten eine "random" funktion. Klar dass diese auch auf nem starren Algorythmus aufgebaut ist und nur uns bis zu einem gewissen Grad zufällig erscheint.

Doch welche Mittel verwenden diese Random Funktionen um nicht auf jedem Computer gleich abzulaufen? Welche externen Parameter werden da mit einbezogen? Laufzeit und solche Sachen? Wär für ein paar Tipps und Links dankbar!

Cheers :)
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Im Prinzip kannst du dir das so vorstellen. Auf dem PC befindet sich eine Liste mit Zahlen. Die Liste ist natürlich so aufgebaut, dass jede Zahl in möglichst der gleichen Anzahl vorhanden ist. Außerdem müssen die Zahlen möglichst gleichmäißg auf die Liste verteilt werden. Das ganze aber ohne ein Muster. Die Randomfunktion holt dann anhand irgendwelcher Parameter eine Zufallszahl von der Liste. Rufst du Random nochmal auf, nimmt es eine andere Zufallszahl. In vielen Fällen handelt es sich bei dem Parameter um die Zeit. Vor kurzem habe ich zum Beispiel eine Passwortgenerierung in der Hand gehabt. Diese hat lokal auf dem PC des Entwicklers wunderbar funktioniert. Auf dem Server allerdings wurden mehrere Passwörter in einer ms generiert, die dann "rein zufällig" alle genauso aussahen. Die Randomfunktion wurde jedesmal mit dem selben Parameter aufgerufen und hat entsprechend jedesmal die gleiche Zufallszahl aus der Liste geholt. Eine ms später wäre es die nächst Zufallszahl gewesen, die ja laut Liste kein Muster zur vorherigen Zahl hat.

Edit: Das ganze ist dann aber trotzdem noch eine Pseudozufallszahl. Den Grund habe ich bereits genannt. Eine Passwortgenerierung in der selben ms mit immer dem gleichen Ergebniss gibt es bei richtigen Zufallszahlen nicht. Das ist nur mit Pseudozufallszahlen möglich.
 
Zuletzt bearbeitet:
Normalerweise wird zur Zufallszahlenberechnung die interne Uhr des PCs verwendet.
Das hat zumind. unser Lehrer damals in der Berufsschule erzählt.
 
Aus der Manpage zu rand():

Code:
EXAMPLE
       POSIX.1-2001 gives the following example of an implementation of rand()
       and srand(), possibly useful when one needs the same  sequence  on  two
       different machines.

           static unsigned long next = 1;

           /* RAND_MAX assumed to be 32767 */
           int myrand(void) {
               next = next * 1103515245 + 12345;
               return((unsigned)(next/65536) % 32768);
           }

           void mysrand(unsigned seed) {
               next = seed;
           }

Eine bessere Implementierung eines Zufallszahlengenerators, hab ich mal für eines meiner Projekte gebaut:

http://trac.incertum.net/boskop/browser/trunk/src/rrand.c
 
Zuletzt bearbeitet:
Gabs da nicht mal extra von Intel einen Widerstand auf dem CPU der Temperaturabhängig andere Werte liefert und so eine echte Zufallzahl erzeugt? Oder täusche ich mich komplett ?
 
es gibt alle möglichen lösungen, von der laufzeit gewisser geschichten im prozessor selbst, über die systemzeit (10stelle der aktuellen zeit mit irgendwelchen stellen von pi verrechnet, was es da nicht alles gibt...) bis hin zu variablen aus der bewegung der maus oder ähnlichem...
ist zum bsp ein problem, wenn deine geshichte aus der mausbewegung unvorhersagbare werte für den zufall nehmen will, die geschichte dann aber auf nem server ohne bewegter maus läuft... da muss dan ein anderer ansatz her und am besten noch ein zufallsgenerator mit großem speicherpool um dann bei abfrage von zufallswerten auch immer schnell genügend liefern zu können und nicht nach 2 werten schon wieder anfängt elend langsam neue zu generieren...
 
Früher wurde mal das Mid-Square-Verfahren gerne angewandt. Man nimmt da die Zahl mit der der Zufallsgenerator initialisiert wird. Davon bildet man das Quadtrat und davon nimmt man dann die mittleren beiden Zahlen/die mittlere Zahl. Daraus ergibt sich dann die "Zufallsfolge", z.B. 42, 76, 77, 92, 46, 11, 12, 14, 19, 36, 29, 84, 5, 2, ... und wenn man es schlecht erwischt ergibt sich 24, 57, 24, 57, ... nun ja, deshalb benutzt man es nicht mehr.

Ich habe hier ein Buch und da wird als besseres Beispiel die Funktion z(i) = (z (i-1) * 21 + 17) mod 40 genannt... die generiert eine 40 Zahlen lange Folge die sich anschließend wiederholt... (in dem Buch wird außerdem Beschrieben dass richtige Computer ähnlich arbeiten, nur ist die Funktion ungleich komplexer...)


Und nochwas was ich mir an dieser Stelle nicht verkneifen kann...
random20generator1.png


random20generator2.png


_anstalt
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh