C++ Random hilfe
Tino
- sonstiges
Hallo,
ich möchte in c++ eine zahl bekommen, die sich bei jedem start verändert.
in einer Liste:
zeile 5: zahl ist bei jedem start gleich.
wenn ich mit der methode srand(int var) arbeite, muss ich immer die var ändern um eine andere zahl zu bekommen.
welche möglichkeit habe ich, das die zahl sich selber ändert, ohne meine hilfe wie bei srand() ?????
<1 ListeWeg::iterator it;
<2 iAnzahlListenelemente=0;
<3
<4 iAnzahl=p_ptwegliste.size();
<5 zahl=rand()% iAnzahl; // RANDOM zahl die immer gleich bleibt
<6
<7 for (it=p_ptwegliste.begin();it!=p_ptwegliste.end();it++)
<8 {
<9 if(zahl==iAnzahlListenelemente)
<0 {
< (*it)->vAnnahme(fz);
< cout << **it << endl;
< }
< iAnzahlListenelemente++;
<
< }
danke für die hilfe
Hey Tino,
zeile 5: zahl ist bei jedem start gleich.
Du initialisierst ja auch den Zufallsgenerator nicht neu :)
wenn ich mit der methode srand(int var) arbeite, muss ich immer die var ändern um eine
andere zahl zu bekommen.
Ja. Deshalb nimmt man in der Regel sowas wie
srand(getpid() ^ time(NULL))
oder so. In »Algorithmen mit C« wird weiter empfohlen, die Zahl dann so zu generieren:
int num = (int)(((float)num) * rand() / (RAND_MAX + 1.0));
welche möglichkeit habe ich, das die zahl sich selber ändert, ohne meine hilfe wie bei
srand() ?????
Du kannst selbstverständlich deinen eigenen Zufallszahlengenerator schreiben, das ist aber nicht ganz einfach :-)
Viele Grüße!
Hallo,
welche möglichkeit habe ich, das die zahl sich selber ändert, ohne meine hilfe wie bei srand() ?????
du musst den seed-Wert fuer Deinen Zufallsgenerator (d. h.
der Wert, der in srand(...) gesteckt wird) "zufällig"
ermitteln. Eine Möglichkeit ist - wie bereits in diesem
Thread erwähnt - der Timer. Unter Linux kann man
auch das device /dev/urandom nutzen, welches einen
"Entropiepool" bestehend aus Timer, Tastendrücken,
Interrupts und in einigen Fällen auch Hardware-
Zufallsgeneratoren nutzt.
Ein Beispiel möge die Nutzung demonstrieren:
#include<stdio.h>
int main(void) {
int seed;
FILE *urandom;
if(urandom = fopen("/dev/urandom", "r")) {
fread(&seed, sizeof(int), 1, urandom);
seed &= 0x7fffffff; /* Nur positive Zahlen zulassen */
printf("Seed-Wert = %i\n", seed);
fclose(urandom);
} else {
puts("Konnte /dev/urandom nicht oeffnen\n");
exit(1);
}
return 0;
}
Man kann statt /dev/urandom auch /dev/random nutzen. Letzteres
soll einen "kryptographisch starken" Zufallsgenerator darstellen,
kann aber - im Gegensatz zu /dev/urandom - blockieren.
Beim Runterfahren von Linux wird der Zustand der "Zufallsgeräte"
zwischengespeichert, so bei jedem System-Neustart
eine andere Sequenz von Zufallszahlen erzeugt wird.
Viele Grüße
Andreas Pflug