Tino: C++ Random hilfe

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

  1. 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!

  2. 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