Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Zufallszahlen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.09.2004, 12:12 Uhr
(un)wissender
Niveauwart


Hallo, die WinAPI stellt sich einige Funktionen bereit, um
Zufallszahlen zu erzeugen, rand() reicht mit nicht, da es nur kleinere Zahlen erzeugt.
Diese Funktionen finde ich leider nicht mehr, kann mir da einer von euch helfen?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.09.2004, 12:45 Uhr
virtual
Sexiest Bit alive
(Operator)


Eigentlich sollte es doch kein Problem sein, mit ran() auch ganz große Zufallszahlen zu erzeugen:

C++:
unsigned rand16() {
     return rand()%256 + 0x100*(rand()%256);
}

unsigned long rand32() {
     return rand16() + 0x1000ul*rand16();
}

unsigned long long rand64() {
     return rand32() + 0x10000000ull*rand32();
}


Selbst wenn es im WinAPI entsprechende Routinen geben sollte, so würde ich mal annehmen wollen, daß sie innen drin ähnlich aussehen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 09.09.2004 um 14:56 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.09.2004, 12:47 Uhr
ao

(Operator)


Was meinst du mit "kleinere Zahlen"? Was für Zahlen brauchst du denn?

rand () liefert eine Zahl zwischen 0 und 32767, d.h. 15 zufällige Bits. Wenn du mehr Material brauchst, dann rufe rand () mehrmals auf und kombiniere die Ergebnisse geeignet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.09.2004, 13:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


er hat schon nicht ganz unrecht damit das 15 bits nicht gerade ne wucht sind. da legt man sich schon bei jeder mittleren simulation mit die karten...

ich habs noch nie benutzt aber boost soll angeblich jede menge zufallszahlengeneratoren bereithalten... wenn du ersthaft zufallszahlen brauchst kannst du rand nur in die tonne kloppen...

die verschieberei die virtual da macht ist auch ne ganz nette lösung allerdings verzerrst du damit die gleichverteilung...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.09.2004, 13:06 Uhr
(un)wissender
Niveauwart


Eben, die Gleichverteilung sollte erhalten bleiben.
Aber boost ist ein guter Tipp!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.09.2004, 14:24 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf:
Belege das mir bitte! - Ich höre dieses Gegenargument hin und wieder, aber ich verstehe es nicht, weil es einfach im Raum stehen bleibt:. Ich würde Dir zustimmen, wenn ich in rand32 rand und nicht rand16 verwendet hätte, weil rand eben nur eine 15 Bittige Zahl liefert. Aber so sehe ich das Problem erstmal nicht...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.09.2004, 14:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Nachtrag:

Erstmal muß ich mich schämen: In meinem ersten post fehlen in den rand Funktionen diverse Klammern. Habe ich nachgeschoben.

Zweitens:
Ich mal der Numerische "Beweis", daß mit rand zusammengesetzte Zufallsfunktionen eine Gleichverteilung bringen. Man kann ähnliche Tests dann auch machen mit der Fragestellung, wie oft es zB vokommt, daß Gleiche Zahlen hineinander gezogen werden; man kommt in der Regel auf ähnlich befriedigende Ergebisse).


C++:
#include <iostream>
#include <cstdlib>


unsigned rand8() {
     return std::rand()%16 + 16*(std::rand()%16);
}


/*
* Auswertung
*/

void auswerten(int n[256])
{
    /* Berechnung des mittelwerts */
    double amw = 0.0;
    for(unsigned i=0; i<256; ++i)
        amw += i*n[i];
    amw /= 25600;

    /** Berechnung der Standardabweichung */
    double saw = 0.0;
    for(unsigned i=0; i<256; ++i)
    {
        double diff = n[i]*(i-amw);
        saw += diff*diff;
    }
    saw = std::sqrt(saw/25600);

    std::cout<<"Mittel:     "<<amw<<std::endl
             <<"Abweichung: "<<saw<<std::endl;
}

void test() {
    int n[256];

    /* Initialisierung */

    /* Verteilung laufen lassen, jede Zahl sollte im Schnitt 100 mal gezogen worden sein */
    for(unsigned i=0; i<256; ++i) n[i] = 0;
    for(unsigned i=0; i<25600; ++i)
    {
        n[rand8()]++;
    }
    std::cout << "Tatsächliches Ergebnis:"<<std::endl;
    auswerten(n);

    /* zum Verleich: theoretisches Ergebis */
    for(unsigned i=0; i<256; ++i) n[i] = 100;
    std::cout << "Theoretisches Ergebnis:"<<std::endl;
    auswerten(n);

}


int main()
{
    srand(time(NULL));
    test();
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.09.2004, 16:43 Uhr
ao

(Operator)



Zitat von Windalf:
er hat schon nicht ganz unrecht damit das 15 bits nicht gerade ne wucht sind.

Das kommt auf die Aufgabenstellung an. Für Lottozahlen oder Münzewerfen sind 15 Bit schon ok.

Zitat:
wenn du ersthaft zufallszahlen brauchst kannst du rand nur in die tonne kloppen ... die gleichverteilung...

Die Qualität eines Zufallszahlen-Generators wird nicht nur durch die Gleichverteilung der erzeugten Wertefolge bestimmt, sondern auch durch ihre Autokorrelation. Je größer das Korrelationsmaß, desto vorhersagbarer ist die Folge und desto weniger brauchbar ist der Zufallsgenerator. Beispiel: Die Bitfolge

0 1 0 1 0 1 0 1 0 1 0 1 ....

ist perfekt gleichverteilt, aber als Zufallsfolge völlig unbrauchbar.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.09.2004, 17:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
es ist z.b. unmöglich die zahle 4711<<16 +4711 zu erzeugen die aber in einer gleichverteilung vorkommen müsste.
gibt da wohl noch massenweise andere üble effekte die unter anderem mit der von ao erwähnten korrelation abhängen...



Zitat:

Das kommt auf die Aufgabenstellung an. Für Lottozahlen oder Münzewerfen sind 15 Bit schon ok


klar kommts auf die aufgabenstellung drauf an aber öfter braucht man ja gerade nicht eine gleichverteilung sondern eine andere (eventuell sogar eine die für die man nicht mal ne halbwegsbrauchbare geschlossene form findet)

das lässt sich dann zwar alles mehr oder weniger gut basteln aus ner gleichverteilung allerdings brauch man dann um nur eine zahl zu erzeugen relativ viele zahlen aus dem zufi...

für ne ernsthafte simulation lässt man diese auch mit verschiedenen seeds laufen und dafür sollte garantiert sein das die periode des zufallszahlengenerators lang genug ist.



Zitat:

Die Qualität eines Zufallszahlen-Generators wird nicht nur durch die Gleichverteilung der erzeugten Wertefolge bestimmt, sondern auch durch ihre Autokorrelation. Je größer das Korrelationsmaß, desto vorhersagbarer ist die Folge und desto weniger brauchbar ist der Zufallsgenerator. Beispiel: Die Bitfolge

0 1 0 1 0 1 0 1 0 1 0 1 ....

ist perfekt gleichverteilt, aber als Zufallsfolge völlig unbrauchbar.


problem der korrelation ist, das man bei ner simulation meist am ende irgend nen wert zu einem vorher festgelegten konfidenzintervall machen will. also es soll so lange simuliert werden bis sich der wert in diesem konfidenzintervall befindet... dafür muss man allerdings das sigma schätzen und wenn man positiv korreliert werte hat wird dieses tendenziell unterschätzt was dann dazu führt man denkt man ist schon innerhalb der grenzen seines intervalls in wirklichkeit ist das aber noch nicht erreicht da man die varianz unterschätzt hat...

wenn man die korrelationskoeffizienten kennt kennt gibt es auch ne formel die dafür dann die varianz "richtiger" bzw. besser schätzt... meist nimmt man aber batchmeans oder ähnliche verfahren weil die wesentlich weniger rechenaufwendig sind und sucht nach nem zufallszahlengenerator der nur eine korrelation hat die stark abnimmt...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.09.2004, 17:58 Uhr
ao

(Operator)



Zitat von Windalf:
@virtual
es ist z.b. unmöglich die zahle 4711<<16 +4711 zu erzeugen

Wieso ist das unmöglich? Ist irgendwo festgelegt, dass rand () nie zweimal aufeinanderfolgend dieselbe Zahl liefert?

Wenn der Generator ein Gedächtnis hat, das länger ist als der letzte zurückgelieferte Wert, dann geht das.

Dieser Post wurde am 09.09.2004 um 18:01 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: