Zufallszahlen mit rand()



  • Ich habe eine kleine Funktion geschrieben, welche eine Zufallszahl generieren soll. Der Code siehr wie folgt aus:

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <time.h>
    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "Funktionen.h"
    
    int F_Zufallszahl (int gUg, int gOg) //Funktion welche eine Zufallszahl in den Grenzen (gUg und gOg) zurück gibt
    
    {
    	int Zufallszahl=(rand()%gOg+1)+gUg;
    	return (Zufallszahl);
    }
    

    gUg ist eine freiwählbare untere Grenze der Zufallszahl und gOg ist die Obergrenze, in welcher sich die Zufallszahl befinden muss.
    Die Funktion gibt ich eine Zufallszahl in diesem "Range" zurück, jedoch bekomm ich wenn ich die Zufallszahl generiere (mehrere z.b. 100) immer die gleichen Zufallszahlen in der gleichen Reihenfolge. An was kann das liegen?

    Vielen Dank im Voraus.



  • Steht am Anfang deiner main-Funktion

    srand( time(NULL) );
    

    ? Falls nicht, schreib es an den Anfang deiner main-Funktion.



  • Jo, wie out schon sagte: Du musst jede Pseudo-Zufallszahlengenerator seeden, also einen "Anfangswert" festlegen.
    Das kann jeder Wert sein; Am gängigsten ist es, die Anzahl der vergangenen Sekunden seit 1.1.1970 00:00 UTC anzugeben (siehe die von out genutzte time() -Funktion aus der C Standardbibliothek) - die verändert sich nämlich andauernd 😉



  • Und wenn es um Spiele geht macht es Sinn den neuen Seed vom Savegame abhängig zu machen falls es geladen wurde um dort das "simple Cheaten" zu erschweren. Funzt aber auch nur bedingt.



  • Ich habe es vor das Main gesetzt, da bekomm ich aber immer eine Fehlermeldung und zwar:

    Fehler 2 error C2365: "srand": Erneute Definition; vorherige Definition war "Funktion".
    Fehler 1 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    Warnung 3 warning C4244: 'Initialisierung': Konvertierung von 'time_t' in 'int', möglicher Datenverlust

    Und wenn ich das "srand( time(NULL) );" in die Funktion setze, gibt er mir die Zahlen in 3-Schritten aus.
    Nein es geht nicht um ein Spiel.



  • Es muss ja auch IN die main-Funktion.

    Die Zufallszahlen sind eine Kette von "Zahlen". Diese Kette ist immer gleich und jeder Aufruf von rand gibt die nächste Zahl aus. Mit srand gibst du den Anfang in der Kette vor. Wenn du srand nicht setzt fängt er immer vorne an, gibt also bei jedem Programmstart die gleichen Zahlen aus. Rufst du srand vor jedem Aufruf von rand auf bekommst du jedes mal die gleiche Zahl (bis sich time(NULL) verändert).



  • Sone schrieb:

    Jo, wie out schon sagte: Du musst jede Pseudo-Zufallszahlengenerator seeden, also einen "Anfangswert" festlegen.
    Das kann jeder Wert sein; Am gängigsten ist es, die Anzahl der vergangenen Sekunden seit 1.1.1970 00:00 UTC anzugeben (siehe die von out genutzte time() -Funktion aus der C Standardbibliothek) - die verändert sich nähmlich andauernd 😉

    Ich habe mal gehört: "wer nämlich mit h schreib ist dämlich" 😃 .



  • Ok, hab falsch gelesen. "srand( time(NULL) );" ist nun im Main, und funktioniert auch.

    Vielen Dank für die schnelle Hilfe.


Anmelden zum Antworten