Zufallszahl



  • Hi,
    wie kann ich mathematisch eine (möglichst) "echte" Zufallszahl berechnen?

    Danke



  • Wenn man die Zahl 'berechnen' kann, ist sie nicht mehr zufällig. Besser ist es wohl, zufällige Daten zu 'sammeln'. Die Schreibgeschwindigkeit eines Anwenders ist dafür gut geeignet.



  • Naja,
    ich meine wenn man Datum und Uhrzeit nimmt, dann ist die Zahl ja nie gleich, oder? Und dann vielleicht noch die Rechner Ticks in einer bestimmten Zeit einbauen und schon ist die Zahl nie gleich? Nur wie kann man dann eine Zahl berechnen die immer zwischen (am besten) 0 und 1 ist.

    Danke schonmal



  • Deine genannten Methoden sind *mir* nicht zufällig genug. Aber wenn Dir das reicht, dann kommst Du mit den C-Funktionen srand(), time() und rand() vielleicht schon ans Ziel. Um jetzt eine '0' oder '1' zu bekommen:

    int zahl;
    /* bla */
    zahl = zufall & 1;
    

    🙂



  • Und genau da liegt auch schon das Problem:

    1. diese Daten sind nicht sehr zufällig. Immerhin, gib mir Datum und Uhrzeit und ich sag Dir wie's in ner Sekunde aussieht oder in ner Minute... also nicht wirklich zufällig, abgesehen vom Startpunkt.

    2. Diese Funktion, die daraus einen Wert zwischen 0 und 1 berechnet. Wann ist die gut? Wenn sie möglichst gleichmäßig alle Werte raushaut? Naja, in einer zufälligen Folge darf alles vorkommen, auch 100 mal hintereinander die gleiche Zahl. Ist zwar unwahrscheinlich, aber nich unmöglich. Eine solche Funktion ist extrem schwierig zu konstruieren. Und dann kommt wieder das Problem, daß die Werte zum generieren eben doch nur pseudo-zufällig sind...



  • Das ist ganz einfach:
    berechne eine möglichst lange reihe von Primzahlen.
    gehe nun diese Primzahlen der Reihe nach durch, bis die Quersumme dieser Zahl mit den letzten Ziffern der aktuellen Zeit übereinstimmt
    Teile die quersumme der Primzahl mit der quersumme der Zeit
    mach was damit das ergebnis in den gewünschten bereich deiner Zufallszahl passt.



  • Um mal exakt zu sein, der PC von heute kann ne ganze Menge, doch eine zufällige Zahl auszugeben gehört nicht dazu. Da also eh nichts zufällig ist, muss die Funktion auch gar nicht so kompliziert klingen wie die von Eho, um zufällig zu wirken. Nimm doch einfach

    double GetRandomNumber()
    {
        return GetTickCount() % 1000 / 1000.;
    }
    

    und fertig, und mit n bisschen Glück sind die Zahlen auch n bisschen gleichmäßig, aber wie der Zufall halt so is... :p



  • Das ist ganz schlecht, weil im eingeschwungenen Zustand der Abstand der Zufallszahlen konstant sein wird! Eingeschwungen heißt hier: Programm läuft, keine Benutzeraktion, konstante Programmlaufzeit.



  • liefert GetTickCount() nicht die Zeit seit Systemstart? 😕



  • @D1BAKEL was soll das?
    Meine Methode liefert eine in jeder hinsicht perfekte Zufallszahl!



  • Original erstellt von Eho:
    ...
    Meine Methode liefert eine in jeder hinsicht perfekte Zufallszahl!

    Das einzige 'zufällige' an Deiner Methode ist die Zeit. Und die ist nicht gerade sehr zufällig. Oder übersehe ich irgendwas??



  • Naja, ich denke nicht, dass deine Funktion eine Zahl ausspuckt die "zufälliger" wird, indem du bisschen mit Primzahlen und Quersummen rumspielst. Lässt die Rechnung kompliziert erscheinen, ausschlaggebend bleibt aber immernoch der einzige Parameter die Zeit. Wenn wir beide unsere Funkionen implementieren würde, könnten wir sie garantiert nicht unterscheiden, vorausgesetzt, sie liefern Zahlen im selben Raum (0 - 1 etc.).



  • Das Ergebnis ist Zufällig, es ist unmöglich voraus zusagen!



  • Wenn du mir die Zeit sagst kann ichs ausrechnen. Und ohne die Zeit kannst du meins auch nicht ausrechnen. Nach dir ist meine Lösung also auch eine "in jeder Hinsicht perfekte Zufallszahl"? In welchen Hinsichten können Zufallszahlen denn perfekt sein? Meine Zufallszahl kannst du auch nicht voraussagen.

    mfG D1B



  • Leute, hört auf darüber zu streiten.

    Man kann keine echten Zufallszahlen berechnen, nur Pseudozufallszahlen.

    Ob ein solcher Pseudogenerator gut ist, dafür gibt es statistische Tests - diese prüfen Verteilung, Mittelwert, Streuungen, Folgenlängen, usw. Wenn eine Formel den Test erfolgreich besteht, so kann man sie verwenden.

    Und die Zeit ist sehr gefährlich in einem Programm - weil Programmdurchläufe im Mittel nämlich immer gleich lang dauern.

    D.h. der Timer ist bis zum nächsten Aufruf immer gleich viel weiter gelaufen, so daß der Abstand von Zahl zu Zahl weitgehend konstant ist. Damit fällt der Generator durch den Test durch.



  • Dann rechne mal aus:
    die Zeit:
    200212618245509,99913813216371637125635126536126735126367135671465146325412735
    (Die stellen hinter dem Komma weiss der Computer natürlich nicht)



  • Dann rechne mal aus: ...

    ... gehe nun diese Primzahlen der Reihe nach durch, bis die Quersumme dieser Zahl mit den letzten Ziffern der aktuellen Zeit übereinstimmt ...

    Vielleicht zeigst Du uns erstmal eine passende Primzahl ?!?

    [ Dieser Beitrag wurde am 06.12.2002 um 18:39 Uhr von mady editiert. ]



  • "Vielleicht zeigst Du uns erstmal eine passende Primzahl ?!?"
    versteh ich nicht



  • Original erstellt von Marc++us:
    **Leute, hört auf darüber zu streiten.

    Man kann keine echten Zufallszahlen berechnen, nur Pseudozufallszahlen.
    **

    Was hälst du hiervon :
    Ich meine, es müsste doch irgendwie möglich sein wirkliche ZZs zu erzeugen indem man einfach nur willkürlich im Speicher rumwühlt, oda ?

    int myRand (int min, int max)
    {
          int l=0;
    
          while (1)
          {
                 int* a = new int [1000];
    
                  if (a[l] > min && a[l] < max)
                         return a[l];
    
                  if (l==999) 
                  {
                         delete []a;
                         l=0;
                  }
                  l++;
          } 
    }
    


  • ich glaube nach Mathematischen Prinzipien muss man diese auch als Pseudo Zufällig bezeichnen, da diese ja von den Programmen/Funktionen abhängig sind, die du vorher hast laufen lassen, die sollten aber eigentlich relativ zufällig sein. Ein Problem ist nur, wenn du nie die entsprechende Zahl findest läuft dein System unendlich lange (man sollte vielleicht sagen nach 3 Runden ist schluß) und du hast einen Bug in deiner Implementierung


Anmelden zum Antworten