Zufallszahl



  • 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



  • Nur falls es jemand noch nicht kennen sollte:
    http://www.noentropy.net/



  • Hi !

    Aus dem KDE Source :

    [cpp]
    Z. 630, kapplication.h
    /**
    * Generates a uniform random number.
    * @return A truly unpredictable number in the range [0, RAND_MAX)
    */
    static int random();[/cpp]

    Mmh, kann man sich ja mal angucken, oder 😉 ?



  • @Eho und D1BAKEL
    Eure Methoden sind beide gleich schlecht, wobei Ehos noch dazu undefiniert ist. Welche Folge von Primzahlen soll das sein? Warum sollen es überhaupt unbedingt Primzahlen sein?



  • @eho:

    Wenn ich das Teil z.B. um 12:24 laufen lasse, dann liefert es mir auf zwei verschiedenen Rechnern identische Ergebnisse, oder? Findest Du das zufällig? Eigentlich ist das verdammt unwahrscheinlich. Bei Dir ist es aber immer der Fall.



  • Leute, es ist vollkommen egal, was ihr mit der aktuellen Uhrzeit macht und über wieviel 1000 Umwege ihr die Zahl berechnet, es ist kein Zufall 🙂
    Das mit den Benutzereingaben find ich gut. Man könnte die Zeit messen, wie lang der Benutzer braucht, um einen Menüpunkt anzuklicken. Da müsste dann aber jede ms was völlig anderes rauskommen, die Formel muss also chaotisch sein.
    (Collatz-Folge? 😉 )

    [ Dieser Beitrag wurde am 11.12.2002 um 20:38 Uhr von Optimizer editiert. ]


Anmelden zum Antworten