Zufallsgenerator programmieren?

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

Ghunther  10.06.2012, 16:41

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.

0

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 :/

Ghunther  10.06.2012, 15:11

Nur zur Vollständigkeit: Im allgemeinen Vorzeichenlosen Binärsystem ist 0001 eine dezimale 1 und 10101 eine dezimale 21

0
moritz1996 
Fragesteller
 10.06.2012, 15:25
@Ghunther

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?

0
Ghunther  10.06.2012, 16:11
@moritz1996

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.

0
Ghunther  10.06.2012, 16:36
@Ghunther

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.

0

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.