doppelte srand() initialisierung

Dieses Thema im Forum "C/C++" wurde erstellt von noreaga, 16.06.2008.

  1. #1 noreaga, 16.06.2008
    noreaga

    noreaga Eroberer

    Dabei seit:
    07.10.2005
    Beiträge:
    64
    Zustimmungen:
    0
    Hallo!
    Ich habe ein kleines Problem beim erzeugen von Zufallszahlen. Für mein Praktikum in Algorithmen und Datenstrukturen ist ein Tool zur Laufzeitmessung verschiedener Sortieralgorithmen zu schreiben. Dazu benötige ich ein Array mit zufälligen Werten. Dazu verwende ich folgenden Code:

    Code:
    const int * generator::init() {
    
    	srand(time(NULL));
    	unsigned int factor = (rand() % 100);
    	
    	srand(clock());
    	for(int p=0; p < this->n; p++) {
    		this->walk_ptr[p] =  ((rand() * factor) % this->upper_border);
    
    	}
    	return this->ptr;
    }
    
    Da das Array sowohl einzeln als auch in schleifen neu initialisiert werden soll, habe ich mich entschieden, den Zufallszahlengenerator doppelt zu initialisieren. Einmal abhängig von der Zeit mit srand(time(NULL)) um für einzelne aufrufe zu verschiedenen Zeitpunkten jeweils ein neues Feld zu haben und einmal mit srand(clock()) um andere Zahlen zu bekommen wenn die funktion init() in schleife aufgerufen wird. Leider werden beim Aufruf in schleife trotzdem immer die selben Zahlen geliefert. Weis vielleicht jemand, ob der Zufallszahlengenerator nur 1 mal initialisiert werden kann? Oder hat jemand einen anderen Vorschlag für mein Problem?

    P.S. ich weis, dass die Zahlen durch die modulo operation statistisch nicht mehr gleichverteilt sind... das kann man hier mal vernachlässigen ;)
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 der_Kay, 16.06.2008
    Zuletzt bearbeitet: 16.06.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    Hallo,

    rand() ist meist ein (schlechter) linearer Kongruenzgenerator, d. h. zu einem festen Startwert (via srand()) wird immer der gleiche Zahlenstrom erzeugt, wie man aus der Formel leicht sieht. Es ist also überflüssig, den Generator zweimal zu initialisieren, da nur zwischen zwei im Voraus bestimmten Zahlenströmen hin- un hergeschaltet wird.

    Es ist im übrigen für Debugging-Zwecke durchaus sinnvoll, einen festen Startwert zu wählen.

    Was Dein Problem angeht, das hat lustige Ursachen:

    1.) time() gibt zeit in Sekunden zurück, ein elend langer Zeitraum. Je nach dem, wie schnell du sortierst, wird die init()-Funktion vielleicht zig mal pro Sekunde aufgerufen. Klar, dass dann der Startwert immer derselbe ist.

    2.) Bei clock() schlägt das casten nach unsigned int fehl, Resultat immer 0. Genaues hab ich noch nicht gefunden.

    Mach also programmweit nur einen einzigen srand()-Aufruf.

    p.s.:
    Sortieralgorithmen vergleicht man, indem man die Größenordungen ihrer Laufzeiten für best, average und worst-case berechnet.
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    clock() gibt die Zeit zurueck, die die CPU bisher fuer Dein Programm aufgebracht hat. Der aendert sich an dieser Stelle nur, wenn Du am Code etwas aenderst oder das Programm auf einer schnelleren/ langsameren CPU laufen laesst. Sonst ist der Wert, den clock() dort zurueckgibt, immer der gleiche.

    Du solltest srand einmal in main() aufrufen. Die Idee eines Zufallsgenerators ist, dass dann auch wirklich von rand() stets 'zufaellige' Zahlen zurueckgegeben werden.
     
  5. #4 noreaga, 18.06.2008
    noreaga

    noreaga Eroberer

    Dabei seit:
    07.10.2005
    Beiträge:
    64
    Zustimmungen:
    0
    Danke für die Antworten!
    Ich hatte wohl einen kleinen Denkfehler, jetzt funktionierts jedenfalls so wie ich mir das vorgestellt habe.

    Ich hätte noch ne kleine Frage, die etwas vom Thema abweicht, aber um nicht noch einen Thread aufmachen zu müssen, stell ich die mal hier:

    Um die Laufzeiten der Algorithmen zu visualisieren (es geht bei uns eigtl. nur um die Anzahl der Zuweisungen, Vertauschungen und Vergleiche) möchte ich auf eine möglichst einfache lib zurückgreifen. Es würde für mich die libGD in Frage kommen, da ich das Paket später auf windoze portieren soll und ich mit ihr schon unter PHP gearbeitet habe. Kennt vielleicht jemand eine art Framework um damit simple 2D Graphen schnell zeichnen zu lassen? Ansonsten muss ich mir wohl die Sachen selber schreiben, was auch nicht so viel Aufwand bedeuten würde, aber man spart wo man kann.

    Danke für die Antworten !
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

doppelte srand() initialisierung

Die Seite wird geladen...

doppelte srand() initialisierung - Ähnliche Themen

  1. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  2. Shell Skript zum automatischen Aufräumen von doppelten Ordnern

    Shell Skript zum automatischen Aufräumen von doppelten Ordnern: Hallo, Ich möchte mir ein Shell Script für folgenden Zweck schreiben. Meine Mutter hat auf Ihrem PC und auf verschiedenen Festplatten viele...
  3. skript zum löschen doppelter dateien

    skript zum löschen doppelter dateien: Hallo, ich wollte mir ein Skript schreiben, das doppelte Dateien (gleicher Name) aus einem 2. Ordner löscht/verschiebt. Habe es jetzt soweit:...
  4. Dateien von Linux nach Win verschieben und doppelte Dateien automatisch umbenennen.

    Dateien von Linux nach Win verschieben und doppelte Dateien automatisch umbenennen.: Also unter Linux können Namen von Dateien Zeichen in gross oder Kleinschrift haben und werden dennoch als unterschiedliche Dateien erkannt. Unter...
  5. Linux doppelte Dateien löschen

    Linux doppelte Dateien löschen: Hallo zusammen, Wie kann ich mit einem Script im Linux alle Dateien ausser die neuste in einem Ordner (/home/raphi/Documents) mit der Endung...