Zufallszahlen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zufallszahlen

Beitrag von Dirty Oerti » Do Jul 17, 2008 3:55 pm

Hm....
Ich hab mal nen Test auf meinem Linux gemacht:
0 .DER ZUFALL: 33
1 .DER ZUFALL: 36
2 .DER ZUFALL: 27
3 .DER ZUFALL: 15
4 .DER ZUFALL: 43
5 .DER ZUFALL: 35
6 .DER ZUFALL: 36
7 .DER ZUFALL: 42
8 .DER ZUFALL: 49
9 .DER ZUFALL: 21
10 .DER ZUFALL: 12
11 .DER ZUFALL: 27
12 .DER ZUFALL: 40
13 .DER ZUFALL: 9
14 .DER ZUFALL: 13

Das kommt bei diesem Code raus:

Code: Alles auswählen

#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])
{
        //randomize();
        for (int i= 0; i<15; i++) {
                cout << i <<"  .DER ZUFALL: " << random()%50 << endl;
        }

        return 0;
}
Ist das nicht zufällig genug?

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Zufallszahlen

Beitrag von nufan » Do Jul 17, 2008 3:59 pm

Welchen Compiler benutzt du denn? gcc? Und du aqe89? Denn wenn ihr den gleichen verwendet und er zuvor auch unter Linux programmiert hat, kann ich mir nicht vorstellen, warum es bei Dirty Oerti funktioniert und bei dir nicht.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zufallszahlen

Beitrag von Kerli » Do Jul 17, 2008 4:04 pm

Hier steht fast alles was man über die Standardbibliothek wissen sollte. Es ist natürlich alles plattformunabhängig - Es ist ja schließlich die Standardbibliothek.

rand()

Also von randomize unter C/C++ hab ich noch nie was gehört. Nimm lieber srand():
srand()

Und als Wert zum initialisieren nimm am Besten die aktuelle Zeit:
time()

Eigentlich wäre das auch was für die FAQ...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zufallszahlen

Beitrag von Dirty Oerti » Do Jul 17, 2008 4:40 pm

Also von randomize unter C/C++ hab ich noch nie was gehört.
Hatte ich mal in einem C++-Programm verwendet und hatte super Dienste geleistet.
Das Programm lief aber soweit ich weiß nur auf einem Windowsrechner (anderes konnte ich nicht testen).

Achja: Ich benutze den gcc. :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zufallszahlen

Beitrag von Kerli » Do Jul 17, 2008 5:25 pm

Dirty Oerti hat geschrieben:
Also von randomize unter C/C++ hab ich noch nie was gehört.
Hatte ich mal in einem C++-Programm verwendet und hatte super Dienste geleistet.
Das Programm lief aber soweit ich weiß nur auf einem Windowsrechner (anderes konnte ich nicht testen).

Achja: Ich benutze den gcc. :)
randomize() ist auch wieder so eine Windowsfunktion, bei der Microsoft so tut, als ob sie zum Standard gehören würde...
Und randomize() ruft sowieso wieder die Standardfunktionen srand() und rand() auf.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Zufallszahlen

Beitrag von nufan » Do Jul 17, 2008 5:28 pm

Kerli hat geschrieben: randomize() ist auch wieder so eine Windowsfunktion, bei der Microsoft so tut, als ob sie zum Standard gehören würde...
Und randomize() ruft sowieso wieder die Standardfunktionen srand() und rand() auf.
Also ist randomize nur eine Zusammenfassung der beiden Befehle?

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Zufallszahlen

Beitrag von Dirty Oerti » Do Jul 17, 2008 5:32 pm

Hm...

was ist dann random()?
Ich brauch dazu keine zusätzlichen Header einbinden.
Es funktioniert auf Linux und auf Windows. (Soweit ich weiß)

Ist random() das gleiche wie rand() ?

Was etwas "ungünstig" ist:
Die Zufallsverteilung ist trotzdem nicht unbedingt super.
Eine 0 zu bekommen ist schon recht schwer.

Was ich noch überprüfen müsste: Ob bei jedem Aufruf andere Zufallszahlen generiert werden. Hatte das nämlich mal, dass immer die gleichen generiert wurden.

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

aqe89
Beiträge: 70
Registriert: Sa Jul 05, 2008 9:36 am
Wohnort: Schweiz

Re: Zufallszahlen

Beitrag von aqe89 » Do Jul 17, 2008 5:37 pm

Eine 0 zu bekommen ist schon recht schwer.
hatte mal eine Gleichung die die zzahl verkleinerte ohne random()%50. so wurden die zahlen besser verteilt und die cange auf eine 0 sind deutlich gestiegen. aber leider hat es nicht funktioniert. habe die Zahl nicht mal in unsigned long gebracht, beim berechnen.

werde mal wieder ein paar mögliochkeiten ausprobieren bi ich eine akzeptable lösung habe.
Weis jemand noch irgend eine andere zahl die ähnlich wie time() ist?

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Zufallszahlen

Beitrag von fat-lobyte » Do Jul 17, 2008 5:38 pm

aqe89 hat geschrieben:Mein Problem ist mit diesen Funktionen, dass die Zufallszahlen immer aufsteigend sind.
Zahl Diff
10533
10565 . 32
10601 . 36
10637 . 36
10670 . 33
.....
11176
11212 . 36
11248 . 36
11287 . 39

Ich finde das ein bisschen komisch.
Habe es 2 mal ausprobiert, sind immer aufsteigend aber andere Zahlen, aber immer ähnliche Differenzen immer zwischen 32 und 39.

Es liegt wahrscheinlich an der umrand Funktion, hatte dort mal eine anderen Lösung, gab aber immer einen Integer-Überlauf.
Weiss da jemand eine alternative? Bei Linux könnte man ja noch getpid() rein nehmen. aber bei Windows.

Code: Alles auswählen

unsigned long randtime()
{
    unsigned long randome;
    long min=10000, max=12000;

    srand(time(NULL));

    randome = umrand(min, max);
    printf("%d msec\n",randome);
    return randome;
}


unsigned long umrand( long min, long max)
{
    unsigned long random=0;
    unsigned long rnd = max - min + 1;
    random=rand()%rnd+min;
    return random;
}
Lass mich raten, du rufst die Funktion randtime() in einer Schleife auf? Wenn das so wäre, wäre dann das seltsame verhalten erklärbar. rand() ist nämlich keine funktion, um ZUFALLS zahlen zu erzeugen (dazu müsstest du von /dev/random lesen). rand() gibt nämlich PSEUDOzufallszahlen aus.
Anscheinend ist die Implementierung deiner Version ziemlich schwach.
Nun, aber jetzt zum Grund: Wenn du jedes mal nur randtime() aufrufst, wird jedes mal der seed neu initialisiert, und dann nur die erste Zufallszahl abgefragt. Anscheinend gibt der Algorithmus für die erste Zahl eine Zahl aus, die dem Seed sehr ähnlich ist.

Um wirklich halbwegs zuverlässige Zufallszahlen zu erzeugen, müsstest du nur _ein_ mal den seed mit srand() initialisieren, z.B. in der main() funktion. Versuchs mal.

Übrigens, ich hoffe die Zahlen werden nicht zur Verschlüsselung verwendet, denn rand() liefert eben nichtmal Zufallszahlen, sondern Zahlen die für einen Menschen zufällig aussehen. Das bedeutet, vielleicht sind diese Zahlen vorhersagbar.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Zufallszahlen

Beitrag von Kerli » Do Jul 17, 2008 5:40 pm

dani93 hat geschrieben:Also ist randomize nur eine Zusammenfassung der beiden Befehle?
Soweit ich es aus den darüber gefunden Informationen sagen kann, ist es eine Zusammenfassung dieser Befehle und dabei wird srand mit der Zeit von einem Dos-Timer oder so etwas ähnlichem aufgerufen.

Der übliche Weg ist:

Code: Alles auswählen

#include <cstdlib>
#include <ctime>
//...
srand(time(NULL));
int random_0_to_19 = rand()%20;
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten