tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
1608
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    alixander alixander ist offline Mitglied Silber
    Registriert seit
    Mar 2004
    Beiträge
    70
    hallo Leute!
    Ich bin bei dem Versuch zufallszahlen zu erstellen auf ein Problem gestoßen- also erst mal früher als ich immer solche "DosBox" Programme geschrieben hab (damals hatte ich auch BCB 1) , hab ich meine Zufallszahlen immer so erstellt:
    Mit Randomize() vorbereitet und dann mit random(zahl) erstellt.
    Nun Arbeite ich mit Visual C++ 6 Autorenversion und mach grad ein DirectX Programm, bei dem ich nun auch Zufallszahlen brauche- nur hier geht diese Metode nicht- ich hab schon alle möglichen header inkludiert aber es ging trozdem nicht-
    NUn hab ich im Internet irgentwas von rand() und srand() gelesen , aber das hab ich nciht ganz verstanden. Also wenn mir jemand helfen kann , ich möchte zwei Zufallszahlen erstellen eine zwischen 0 und775 und eine zwischen 0 und 575. Danke schon mal im Vorraus für eure Hilfe - msg alixander
     

  2. #2
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    Hi,

    rand() (stdlib) erzeugt Zufallszahlen von 0 bis RAND_MAX (0x7fff). Mit srand(unsigned int seed) wird der Zufallsgenerator inititlisiert (ein Timer-Wert bietet sich hierfür an).
    So wie ich das sehe, wirst Du, um Zufallszahlen in einem bestimmten Bereich zu erhalten, nicht um eine Integer-Division herumkommen (int number = rand() * (my_max / RAND_MAX) ). Ich bin allerdings auch noch nicht besonders in der Materie (VC++) bewandert, von daher kennt vielleicht jemand eine viel elegantere Methode.

    Gruß
     

  3. #3
    Registriert seit
    Jan 2003
    Ort
    Roßdorf (Hessen)
    Beiträge
    196
    Code :
    1
    2
    3
    4
    5
    6
    
    #include <windows.h>
     
    int ZufallsGenerator(int max)
    {
        return (rand() * GetTickCount() % max + 1);
    }
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Code :
    1
    
    return (rand() * GetTickCount() % max + 1);
    Das rand() sollte eigentlich vollkommen ausreichen, wenn der Generator bei Programmstart mit z.B. srand( GetTickCount() ) initialisiert wurde.

    (Ich kann mir vorstellen, dass durch die Multiplikation mit GetTickCount() eine merkwürdige Verteilung rauskommt.)

    PS: Man muss dem Zufallszahlengenerator einen (immer anderen) Startwert (Samen bzw. Seed) geben (z.B. mit GetTickCount()), da ansonsten immer die selbe Zahlenfolge erzeugt wird. Immerhin handelt es sich ja um Pseudozufallszahlengeneratoren.
    Geändert von Kachelator (14.08.04 um 20:55 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  5. #5
    Avatar von squeaker
    squeaker squeaker ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Würzburg
    Beiträge
    577
    Das (die Wiederholbarkeit der Zahlenfolgen) ist aber z.B. für Simulationen eine gewünschte Eigenschaft, da sie die Wiederholbarkeit des Experiments sicherstellt.
     

  6. #6
    Registriert seit
    Jan 2003
    Ort
    Roßdorf (Hessen)
    Beiträge
    196
    Original geschrieben von Kachelator
    (Ich kann mir vorstellen, dass durch die Multiplikation mit GetTickCount() eine merkwürdige Verteilung rauskommt.)
    so soll das ja auch sein, oder nicht? wenn du nur rand() verwendest... kommt eine einzige zufallszahl beim programmstart raus, die ändert sich nicht... und mit srand hat bei mir früher auch nicht gefuzzt... :/

    ich find das is ne einfache lösung, da brauch man nicht viel rum zu machen

    gruß
     

  7. #7
    Avatar von squeaker
    squeaker squeaker ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Würzburg
    Beiträge
    577
    allerdings erwatet man, dass die Zufallszahlen gleichverteilt sind. Sonst würfelt der Würfel auf einmal z.B. mehr 5er als 1er und das wäre schlecht.
     

  8. #8
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    @Rook: Die Verteilung sollte gleichmässig sein (auch LaPlace-Verteilung genannt). Bei der GetTickCount-Methode werden die Resultate im Schnitt immer grösser, je länger der Rechner läuft. Nach etwa 40 Tagen ununterbrochenen Laufens (unter Windows unwahrscheinlich ) erreichen sie ein Maximum, kurz bevor GetTickCount() dann den Wertebereich einmal durchlaufen hat. Danach geht es wieder mit (tendenziell) kleinen Zahlen los. Das ist keine gute Verteilung.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  9. #9
    Avatar von squeaker
    squeaker squeaker ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Würzburg
    Beiträge
    577
    das stimmt jetzt wegen des % Operators nicht wirklich, aber die Gleichverteilungsannahme müßte trotzdem erst einmal überprüft werden.
     

  10. #10
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Original geschrieben von squeaker
    das stimmt jetzt wegen des % Operators nicht wirklich
    Okay, bei sehr kleinen max -Werten kann man es vielleicht vernachlässigen, aber warum überhaupt den ganzen Aufwand treiben, wenn ein srand() mit GetTickCount() zu Beginn der Anwendung genügt? Abgesehen von der Verteilung, meine ich.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  11. #11
    Avatar von squeaker
    squeaker squeaker ist offline Mitglied Platin
    Registriert seit
    Jun 2004
    Ort
    Würzburg
    Beiträge
    577
    Prinzipiell hast du recht - aber das mit der Tendenz (Anfang klein, dann groß) dürfte nicht stimmen. Aber eigentlich egal wenn man es von Anfang an macht wie vorgesehen.

    Ich nehme an damit ist alles ausdiskutiert.
     

Ähnliche Themen

  1. Random Zahlen unter Java
    Von bRainLaG im Forum Java
    Antworten: 4
    Letzter Beitrag: 03.11.10, 18:34
  2. PHP zufalls zahlen
    Von Doogie im Forum PHP
    Antworten: 4
    Letzter Beitrag: 26.02.10, 10:09
  3. random(x) bringt immer die gleichen Zahlen...
    Von _Dome_ im Forum Borland CBuilder und VCL
    Antworten: 2
    Letzter Beitrag: 05.07.06, 18:06
  4. [Flash MX] Random 0-8 Zahlen in eine Variable
    Von Eisbaer im Forum Flash Plattform
    Antworten: 6
    Letzter Beitrag: 31.01.04, 00:23
  5. Antworten: 2
    Letzter Beitrag: 12.06.03, 09:44