Wie wird eine Zufallszahlen generiert ??



  • 1. Wie erschafft ein Programm zufallszahlen ??
    Also zum bsp die funktion rand() oder so ?? danke.

    2Fragen : 1. Wie funktionieren Zufallszahlen (Computer) 2. Was ist nen Modulo ??



  • Bitte keine Doppelpostings!
    Warum schaust du nicht einfach in die FAQ: Wie erstelle ich eine Zufallszahl zwischen 1 und 100? 🙂



  • Schau dir doch einfach den Quellcode von rand() an... 🙄



  • danke, ich meinte das aber generrel z.b. auch bei vb wird das auch per Zeitauslesen usw. gemacht ??



  • Das wird eigentlich nie per Zeit auslesen gemacht... Du meinst, daß man den Startwert aus der Zeit setzt? Ja, das wurde schon auf dem C64 so gemacht... und das war vor 20 Jahren. 😉

    [Ok, unter Linux kann man von einem rand-Device direkt Zahlen lesen, die aus dem thermischen Rauschen gewonnen werden, aber bleiben wir mal beim Normalfall]

    Ein Zufallszahlengenerator sieht so aus:

    static int basiswert = 12345;
    
    int rand()
    {
       basiswert = irgendeinefunktion(basiswert) % obergrenze;
       return basiswert;
    }
    
    void srand(int start)
    {
       basiswert = start;
    }
    

    Ok, was passiert wenn Du das Programm startet, steht nun im basiswert halt immer die gleiche Zahl drin... daher nimmt man die Zeit um den Basiswert zu verändern und die Ausgangszahl für die Berechnung von Programmlauf zu Lauf unterschiedlich zu haben. Und wie gesagt, diese Idee verwendet man schon seit Anbeginn der Zeit (oder fast so lange).

    Trickreich und wichtig für die Güte des Generators ist aber die Funktion, die in rand aufgerufen wird... da kommen allerlei Divisionen mit Primzahlen vor. Ein Generator ist dann gut, wenn er gewisse statistische Tests besteht (dauert lange, bis sich Zahlen wiederholen, alle Zahlen gleich oft, usw).

    Kannst ja mal versuchen, z.B. einen Generator für Zahlen von 1..16 zu entwickeln... z.B. mit Basis = (Basis + (Basis * 31) / 11)%15. Das wäre schon ein Generator vom gleichen Prinzip... nur mußt Du jetzt mal schauen, welche Zahlen er ausspuckt.



  • Achso, hatte dich wohl falsch verstanden 🙄
    Du hast halt einen Startwert (z.B. aktuelle Systemzeit) jetzt ermittelst du anhand von einem Algorithmus fortlaufend "Zufalls"-Zahlen. Es sind also in Wirklichkeit keine Zufallszahlen. Das merkst du, wenn du zweimal mit dem gleichen Startwert 100 Zufallzahlen ausgeben lässt: die beiden Reihen sind identisch 🙂
    Ich hoffe ich konnt dir helfen 😉 - schon mal danach gegoogled?

    edit: Mit Marc++us kann ich wohl noch nicht so ganz mithalten 😃

    [ Dieser Beitrag wurde am 05.03.2003 um 19:30 Uhr von flenders editiert. ]



  • übrigens liefert rand keine Zufallszahlen, sondern nur wie bisher gesagt "Pseudozufallszahlen".

    In dem Buch "Angewandte Kryptographie" findest du eine sehr interessante Diskussion über das Thema wie man echte oder zumindest sehr gute Zufallszahlen erstellen kann.

    @Marc++us
    Linux hat übrigens 2 Zufall Devices, eines arbeitet mit Hilfe der Tastatur- und Mausbewegungen 🙂



  • Kennt einer Libs oder Funktionen um bessere Zufallszahlen zu erstellen, die Berechnung derer sollte nicht zu viel Prozessorzeit beansruchen



  • wieso sind dir die zufalszahlen von rand() nicht gut genug?
    Was meinst Du mit einer 'besseren' Zufallszahl.
    Am End kann ein Computer keinen 'echten' Zufallszahlen erzeugen. Die Güte einer Reihe von Zufallszahl hängt einzig und alleine von ihrer Streuung ab.
    Einfache Funktionen mit guter Streuungen können sein:
    f(x) =(a * x + b) mod m
    wobei a und b paareise verschiedene Primzahlen sind, oder
    f(x) = aufrunden(m*x*z) mod m
    wobei z zwischen 0 und 1 liegt. Interessant ist in diesem Beispiel eine besonders gute Streung, wenn z ungefähr der "Goldene Schnitt": (Wurzel(5)-1)/2 ist.
    Dafür gibts sogar mathematische Evidenz. Auf die hab ich jetzt aber kein Bock 😉



  • OT:
    Naja, also wenn ihr das so genau nehmt (vonwegen Berechnung über die Zeit => im prinzip keine Zufallszahl), dann gibt es wohl überhauptkeine Zufallszahlen! Weder auf dem PC noch im realen leben.
    Denn letztenendes wird auch eine Zufallszahl im realen Leben immer irgendwie "initialisiert"! Nur halt in diesem Fall durch Vektoren(Kräfte), Reibung, usw. (Bsp. Würfel).
    Es gibt demnach keine Zufallszahlen, sie sind nur aus dem Auge des (außenstehenden) Betrachters Zufällig.

    [ Dieser Beitrag wurde am 06.03.2003 um 00:01 Uhr von THE_FreaK editiert. ]



  • unwissender der vielen diskussionen über den zufall in diesem forum... 🙄



  • @TheFreak:

    Es hat ja auch keiner behauptet, daß es echte Zufallszahlen gibt. Allerdings haben wir (mathematisch)definiert, wie sie aussehen sollen und können daher mit ihnen Rechnen (Gleichverteilungsannahme etc.). Das einzige, was wir hier behaupten, ist daß man mit dem Rechner (ich meine mit dem Rechner allein, ohne Maus-Bewegungen oder so)´keine echten Zufallszahlen erzeugen kann.

    MfG Jester, der hofft, einer neuen Zufalls-Diskussion zu entgehen.



  • Original erstellt von THE_FreaK:
    Weder auf dem PC noch im realen leben.

    Doch, gibt es im realen Leben => thermisches Rauschen.



  • Unschärferelation!



  • Original erstellt von Marc++us:
    Doch, gibt es im realen Leben => thermisches Rauschen.

    *unterstütz* http://random.org

    (oder auch http://www.noentropy.net/ 😉 )



  • Original erstellt von <GKone>:
    wieso sind dir die zufalszahlen von rand() nicht gut genug?
    Was meinst Du mit einer 'besseren' Zufallszahl.
    Am End kann ein Computer keinen 'echten' Zufallszahlen erzeugen. Die Güte einer Reihe von Zufallszahl hängt einzig und alleine von ihrer Streuung ab.
    Einfache Funktionen mit guter Streuungen können sein:
    f(x) =(a * x + b) mod m
    wobei a und b paareise verschiedene Primzahlen sind, oder
    f(x) = aufrunden(m*x*z) mod m
    wobei z zwischen 0 und 1 liegt. Interessant ist in diesem Beispiel eine besonders gute Streung, wenn z ungefähr der "Goldene Schnitt": (Wurzel(5)-1)/2 ist.
    Dafür gibts sogar mathematische Evidenz. Auf die hab ich jetzt aber kein Bock 😉

    mein VB code dazu (habe gerade keinen c++ compiler :D) :

    Private Sub Command1_Click()
    'variablen
    Dim z As Integer
    Dim m As Integer
    Dim x As Integer
    Dim d As Integer

    'vars einen Wer zuweisen
    d = 12 'd= 12
    z = (Sqr(5) - 1) / 2 'z =(Wurzel(5)-1)/2
    m = Sqr(5) 'm ist Wurzel aus 5
    x = 5 ' x = 5
    MsgBox Round(m * x * z) Mod d ' aufrunden(m*x*z) Modulo d
    End Sub

    da kommt IMMER 10 raus - also keine Zufallszahl 😞



  • Original erstellt von Marc++us:
    **Das wird eigentlich nie per Zeit auslesen gemacht... Du meinst, daß man den Startwert aus der Zeit setzt? Ja, das wurde schon auf dem C64 so gemacht... und das war vor 20 Jahren. 😉

    [Ok, unter Linux kann man von einem rand-Device direkt Zahlen lesen, die aus dem thermischen Rauschen gewonnen werden, aber bleiben wir mal beim Normalfall]

    Ein Zufallszahlengenerator sieht so aus:

    static int basiswert = 12345;
    
    int rand()
    {
       basiswert = irgendeinefunktion(basiswert) % obergrenze;
       return basiswert;
    }
    
    void srand(int start)
    {
       basiswert = start;
    }
    

    Ok, was passiert wenn Du das Programm startet, steht nun im basiswert halt immer die gleiche Zahl drin... daher nimmt man die Zeit um den Basiswert zu verändern und die Ausgangszahl für die Berechnung von Programmlauf zu Lauf unterschiedlich zu haben. Und wie gesagt, diese Idee verwendet man schon seit Anbeginn der Zeit (oder fast so lange).

    Trickreich und wichtig für die Güte des Generators ist aber die Funktion, die in rand aufgerufen wird... da kommen allerlei Divisionen mit Primzahlen vor. Ein Generator ist dann gut, wenn er gewisse statistische Tests besteht (dauert lange, bis sich Zahlen wiederholen, alle Zahlen gleich oft, usw).

    Kannst ja mal versuchen, z.B. einen Generator für Zahlen von 1..16 zu entwickeln... z.B. mit Basis = (Basis + (Basis * 31) / 11)%15. Das wäre schon ein Generator vom gleichen Prinzip... nur mußt Du jetzt mal schauen, welche Zahlen er ausspuckt.**

    da kommt auch IMMER nur 10 raus :

    Private Sub Command1_Click()
    Dim basiswert As Integer
    Dim Obergrenze As Integer
    basiswert = 12345
    Obergrenze = 12

    basiswert = (Sqr(5) - 1) / 2 * basiswert Mod Obergrenze

    MsgBox basiswert

    End Sub

    "void srand(int start)
    {
    basiswert = start;
    }"

    ich will ja keine zufallsfunktion aufrufen.. 🙄

    machs jetzt über ne time funktion :p (anders geht das net oder ?? weil du ja immer die gleiche rechnung drinne hast - also er rundet immer gleich oder du musst ne formel erzeugen, die eine richtig lange zahl ausspuckt, und nach 0,00314 sec hörst du auf oder so und nimmst die letzten 2stellen oder so, rechnet ja mal schneller mal langsamer je nach cpu auslastung ;))

    [ Dieser Beitrag wurde am 06.03.2003 um 16:02 Uhr von Ranus.net editiert. ]



  • Original erstellt von THE_FreaK:
    Weder auf dem PC noch im realen leben.

    Wie steht's mit Schrödingers Katze? 😉



  • ahjo, falls es euch interresiert : hier mein projekt :
    http://www.coders-zone.de/board/thread.php?threadid=93&boardid=8&styleid=4

    mit code c ya



  • OT:

    @Jester: war villeicht etwas zu allgemein formuliert von mir... 🙄
    deshalb hab ich ja auch extra "OT:" geschrieben, weils etwas am Thema vorbeigeht 😉

    @Marc++us
    Nungut, es ist definitiv nicht leicht zu berechnen, allerdings (nachdem was ich bisweilen über thermisches rauschen gelesen hab)scheint es doch eine abhängige größe der Temperatur zu sein.

    Fakt ist doch jedenfalls, das selbst wenn wir etwas nicht berechnen können es nicht heißt das es nicht berechenbar ist. Hier spielt wieder die perspektive eine Rolle!

    Ein Sack voll weißer Kugeln. Person A weiß das sich eine schwarze Kugel in dem Sack befindet, Person B weiß das nicht. B nimmt eine Nach der anderen aus dem Sack heraus. Angenommen B erwischt die schwarze als letztes, dann steigt für B mit jeder weißen Kugel die w*****einlichkeit, das er nur weiße Kugeln aus dem Sack herausholt. A jedoch hat eine information mehr. Für ihn steigt die wahrscheinlichkeit, dass B eine schwarze Kugel findet.

    Ok, abgeschweift! ...aber villeicht auch nicht, denn was ist denn wenn wir mit dem thermischen rauschen die weißen Kugeln Ziehen? Villeicht finden wir bald ne schwarze?!

    Ich hab nun zugegeben viel nach dem thermischen rauschen gesucht, da ich damit absolut nichts anfangen konnte, aber was klar geworden ist:
    Das thermische rauschen hängt von der temperatur des objektes ab. da es sich um elektronenbewegung handelt wird auch das Material eine Rolle spielen, usw. führt man das weiter so lässt sich garntiert irgendwann eine Formel aufstellen, und schwups sind unsere Zufallszahlen keine mehr, weil eindeutig berechenbar 😉

    Greetz
    THE_FreaK

    PS: sry falls ich euch damit nerve *g*


Anmelden zum Antworten