Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Korowai

unregistriert

1

25.08.2015, 18:55

Zufallszahlen

Hi, habe eine Nachfrage bezüglich dem Einsatz von rand.

Ich habe ein Programmteil, der mehrere Zufallszahlen erstellt.

Dazu habe ich in der main die Zeile

Quellcode

1
srand(static_cast<unsigned int>(time(0)));


und rufe dann in verschiedenen Funktionen Zufallszahlen ab:

Bsp:

Quellcode

1
Kostenentwicklung= rand()%99+1;


An sich genauso, wie in einem Buch beschrieben und in tausenden Internetforen als BEispiel dargestellt.
Im Kopf der main rufe ich auch alle wichtigen header für die Aufgabe auf.

Trotzdem ruft der code immer die gleichen Zufallszahlen ab.
Ich habe mir boost angesehen, möchte aber erstmal mit rand die AUfgabe lösen.

Habe ich etwas vergessen?
Wäre für Hilfe sehr dankbar,

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

25.08.2015, 20:00

srand initialisiert den Generator. Da Du immer die selbe Zahl für den Start nimmst, ist auch die Zahlenfolge auch immer gleich. Übergibt eine andere Zahl, zum Beispiel die Zeit und dann passt es. Das steht sicherlich aber auch ein paar Seiten weiter im Buch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.08.2015, 21:05

Aber er benutzt doch die Zeit ...

4

25.08.2015, 21:19

srand und rand sind scheußlich. Aller spätestens, wenn man eine andere Verteilung benötigt, wird es lustig. Man sollte auf das random-Modul zurückgreifen, wo wirs schonmal haben.
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::uint_fast32_t seed = 0U;
try
{
    std::random_device rd; //produces non-deterministic random numbers (if possible)
    seed = rd(); //may throw if generation is not possible
}
catch(std::exception& e)
{
    //simply use time as seed then
    seed = std::chrono::system_clock::now().time_since_epoch().count();
}
std::mt19937 mt(seed); //PRNG

std::uniform_int_distribution<int> int_distribution(0, 10);
int random_int = int_distribution(mt);

std::uniform_real_distribution<float> float_distribution(0.f, 1.f);
float random_float = float_distribution(mt);

Probier es gleich mal online aus.
Wenn du jedoch unbedingt das ganze mit der Hilfe von srand und rand lösen möchtest, musst du uns mehr Code zeigen, denn so sollte eigentlich nicht bei jeder Ausführung die gleiche Zeichenfolge kommen. Kannst du hier auch ausprobieren.
(nur nicht zu schnell wieder auf "Run" klicken, denn time(0) ist in Sekunden, wodurch rand() wieder gleichen Output hätte)

MfG
Check

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

25.08.2015, 21:25

Außerdem, warum der explizite Cast in unsigned int?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

25.08.2015, 21:55

Aber er benutzt doch die Zeit ...
Huch, ich hatte irgendwie nur srand(0) gesehen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Korowai

unregistriert

7

26.08.2015, 08:30

Hi, habe das Problem einigermaßen in den GRiff bekommen.

Ich habe die entsprechende Objektfunktion aus dem Header entfernt und in die main.cpp verschoben. Dann noch einige andere Fehler beseitigt und jetzt funktioniert es.

Warum das so ist, ist mir nicht klar.


Struktur war folgendermaßen:

struct Preisentwicklung...

struct Funktion "Preisentwicklung GebePreise(...)

wurde aus dem struct entfernt und als:

float GebePreise (&struct Instanz, ....)

in die main verschoben. Jetzt kann ich in der float Gebe Preise den struct ändern und habe sogar einen spezifischen Rückgabewert.

Wenn Ihr wollt, poste ich gerne den code. Vielen Dank, ich werde mir die anderen Vorschläge ansehen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

26.08.2015, 08:39

Äh, was? Das klingt ehrlich gesagt sehr merkwürdig und nach einer ganz schlechten Entscheidung. Das sollte man definitiv so wohl nicht lösen.
Vielleicht solltest Du Dir angewöhnen generell mehr Code zu zeigen, damit wir überhaupt beurteilen können, was das eigentliche Problem ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

26.08.2015, 23:06

C-/C++-Quelltext

1

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »El .prox« (03.06.2018, 00:19)


Werbeanzeige