Zufallsgenerator programmieren?
Hi
also ich programmiere fleißig an meinem pc im programm game maker. Da mach ich so das eine oder andere spiel. Im GML ist auch eine funktion vorhanden: random(x)
x steht für den zahlenbereich in dem eine zufallszahl generiert werden soll.
Jetzt zu meiner frage, wie funktioniert sowas? der Computer kann doch nur 0 und 1, wie kann er dann sowas zusammenschrauben. Da muss ja irgendeine rechenformel dahinterstehen. Doch beim rechnen ist es ja so, dass 1+2 immer gleich 3 ist.
3 Antworten
Auch wenn die Frage eigentlich schon gut von Ghunther beantwortet wurde, möchte ich es noch etwas weiter ausführen:
Die Systemzeit wird als Ausgangszustand (Seed) für einen Algorithmus genutzt, in den bei jedem erzeugen einer "Zufallszahl" die zuvor erzeugte Zufallszahl einsetzt und eine und eine neue "Zufallszahl" zurückgegeben wird.
Von-Neumann-Methode Bsp:
i(n)=i(n-1)*23%(10^8+1)
i(0) = 71358 (Systemzeit oder irgend eine sich oft ändernde zahl = Seed)
So ergiebt sich weiter:
i(1) = 1641234
i(2) = 37748382
i(3) = 68212778
i(4) = 68893879
i(5) = 84559202
i(6) = 44861627
i(7) = 31817411
i(8) = 31800446
...
Es ergeben sich also eine scheinbar zufällige Zahlenfolgen, die mithilfe eines simplen Dreisatzes in den gewünschten Wehrtebereich gebracht werden kann...
PS:
% ist der so genannte Modulo, er gibt den Rest einer Division zurück
MFG KillerGoldFisch
Standard ist eigentlich eher der linearer Kongruenzgenerator:
http://en.wikipedia.org/wiki/Linear_congruential_generator
Der ist mir vorher allerdings nicht eingefallen (wen wunderts bei dem Namen :P)
Freut mich, dass ich helfen konnte :)
wie es geht weiß ich nicht aber um dein irglauben zu beseitigen 0 und 1 am Computer stehen nicht für 0 und 1 als zahlen sonder für strom aus (0) und strom an (1) zahlen bestehn dann zb aus 0001 für ne 8 oder 10101 für ne 5 (das 0001 eine 8 ist stimmt natürlich nicht ^^) das soltest du auf jedenfall wissen wenn du vorhast dich mehr mit Computern und Programmierung zu befassen
aber zu deinem eigendlichen problem kann ich nichts sagen sry :/
Nur zur Vollständigkeit: Im allgemeinen Vorzeichenlosen Binärsystem ist 0001 eine dezimale 1 und 10101 eine dezimale 21
und nur um das von gh7531 noch mal richtig zu stellen, strom aus ist nicht. Es gibt niedrige spannung und hohe spannung. Ich kenn mich da schon aus. und ich weis auch dass z.B. 11001 eine 25 ist.
aber wenn das von der systemuhr abhängig ist, dann würde das ja bedeuten, dass (sagen wir es wäre nur in minuten getaktet) um 15:01 z.b. 5 raus kommt und um 15:02 dann eine 6 oder wie?
Nein. Das auf eine 5 eine 6 folgen muss ist ein absoluter Fehlschluss. Das wäre nur der Fall wenn der Zufallsgenerator nach dem Prinzip arbeiten würde "Zufallszahl = Konstante + Systemzeit". Da ein Zufallsgenerator nicht Hardware technisch realisiert ist, sondern jede Programmiersprache ihren eigenen nutzt kann ich dir nicht genau sagen wie aus der Zeit deine Zufallszahl berechnet wird.
Du musst dabei allerdings bedenken das die Systemzeit deutlich schneller als Minuten getaktet ist. Schließlich ist ihre Aufgabe die Synchronisation aller Komponenten des Computers. Da wäre Minutentakt vollkommen nutzlos. Selbst einfach die Anzahl Bits die mindesten nötig wären um die größte Zahl die dein Zufallsgenerator erzeugen können soll darstellen zu können aus dem Speicher der Systemzeit zu kopieren, ausgehend vom lsB würden bei einem Zufallsgenerator für einen recht großen Bereich ausreichen um Werte zu erzeugen die uns zufällig vorkommen.
Man wird das so nicht machen, denn man müsste damit rechnen eine zu große Zahl auszulesen und müsste dann wiederholt die Systemzeit abfragen bis ein ausreichend kleiner Wert heraus kommt und Schleifen verlangsamen einen Algorithmus extrem, aber generell ist eine solche Realisierung möglich.
Das klingt beim Lesen doch nicht so leicht verständlich wie es eigentlich ist.
Kleines Beispiel: Wir gehen vereinfachend davon aus das die Systemzeit nur 16 Bit Speicher hat. Die stehen in dem Moment in dem wir die Zufallszahl berechnen wollen auf
0011001100001101
Im Programm steht der Befehl random(212). Es wird also eine Zufallszahl zwischen 0 und 211 gefordert. Um die einzelnen Zahlen zwischen 0 und 211 darstellen zu können benötigst du mindestens 8 Bit, denn 2^7 ist nur 128 und 2^8 ist 256, reicht also aus. Wir nehmen also aus dem Speicher der Systemuhr die 8 niedrigsten Bit.
00001101
Und bekommen als Zufallszahl die 13.
Das wäre ein Beispiel für einen sehr primitiven Zufallszahlengenerator.
Tatsächlich hätten wir hier für eine Zufallszahl die im nächsten Takt produziert wird die 14 bekommen, allerdings ist das ziemlich egal, denn die Systemzeit ändert sich wesentlich schneller als die Anzahl Takte die nötig ist um eine Zufallszahl zu produzieren. Wir können also im nächsten Takt noch überhaupt keine Zufallszahl produzieren.
Schwieriger wird es bei Zufallszahlen wie random(999999999), den dann würden wir, wenn wir schnell hintereinander solche Zufallszahlen abfragen immer sehr ähnliche Zahlen als Ergebnis bekommen. Deswegen sind Algorithmen zur Berechnung einer Zufallszahl auch wesentlich komplexer als nur auslesen und ausgeben.
Diese Pseudo-Zufallszahlen die der PC berechnet haben als Eingabewert die Systemzeit. Die wird dann in eine Zahl aus dem von dir definierten Bereich umgerechnet. Es ist kein echter Zufall, aber weil man als Anwender ohne weiteres nicht sagen kann was passiert reicht es aus.
Sie mal einer an. Ich wusste nicht das es Standartmethoden für die Erzeugung der Zufallszahl gibt. Bin bisher davon ausgegangen die baut sich jeder selbst. Hab ich hier auch noch was gelernt.