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

  • »Caesiumhydroxid« ist der Autor dieses Themas

Beiträge: 26

Wohnort: Dort wo mein PC steht

  • Private Nachricht senden

1

06.07.2013, 22:49

std::rand()- Funktion Probleme

Hallo,

wie schon im Titel steht geht es um die std::rand() - Funktion aus #include<random> (das selbe Problem entsteht auch mit der stdlib.h und time.h).
Mein Programm ist ein "Betrunkenen-Simulator in NY" diesen hat uns unser Lehrer in der Schule "als Vorgeschmack auf das nächste Jahr" (war in der 1.Klasse einer (Elektronik) HTL) gezeigt. Allerdings war dieser in der Konsole programmiert und man konnte keine allzu großen Städte simulieren (ca. 80*80).

Es geht darum, dass ein Betrunkener von Kreuzung zu Kreuzung geht und jedesmal auf dieser zusammenbricht, wieder aufsteht und in eine zufällige Richtung weitergeht. (jede Kreuzung wird als Pixel repräsentiert, auch der Betrunkene ist ein Pixel)Dabei entstanden meiner Meinung nach schöne Muster und ich wollte es im Großformat nachprogrammieren. Ziel ist es das der Betrunkene aus der Stadt findet.


Mein Problem ist nun, dass jedesmal das selbe Muster (bei einer Auflösung von 900*900 Pixeln) entsteht. Es verschiebt sich nur leicht im Fenster. Das Muster sieht folgendermaßen aus:

(Link)


Hier ist der Code:
http://pastebin.com/wU510Gvy

Ich wüsste keinen Grund warum dies so sein sollte, vielleicht kann mir ja Jemand von euch helfen.

Mfg,
Caesiumydroxid
Wer Rechtschreibfehler findet, darf sie behalten ;)

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.07.2013, 22:53

Guck doch mal, was rd.entropy() so sagt. Wenn das 0 ist, dann hast du immer wieder den gleichen Seed für std::rand und dementsprechend immer die gleiche Folge.
Ich würde auch einfach mit der aktuellen Systemzeit seeden. Das sollte für dein Vorhaben reichen.

  • »Caesiumhydroxid« ist der Autor dieses Themas

Beiträge: 26

Wohnort: Dort wo mein PC steht

  • Private Nachricht senden

3

06.07.2013, 23:06

Wenn ich mit der Systemzeit seede kommt das Selbe dabei raus.
Ich habe schon alles mögliche ausprobiert. Der wert von rd.entropy() wäre -1.0737418e+008

Mfg

Edit:
Auch wenn ich einen Seed hardcode kommt bei mir dieses Muster raus.
Wer Rechtschreibfehler findet, darf sie behalten ;)

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

4

06.07.2013, 23:29

Verrückte Idee:
Wenn ich mir den Code so anschaue, dann wunder ich mich, dass der Compiler das überhaupt rafft. Du sagst ja selbst, dass das nur hingezimmert ist..
Ich glaube, dass der Compiler einfach den zuletzt funktionierenden Code herholt und den immer wieder dann im Debug-Modus zeigt.
Vielleicht hattest du beim letzten funktionierenden Build einen hardcodierten Seed und dass es so jetzt nicht mehr geht.

MfG
Fourb
42 / Pi = 13,37

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

5

06.07.2013, 23:44

Andere Möglichkeit: Probier mal die Generatoren, die mit C++11 kamen. Verwenden andere (bessere?) Algorithmen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

idontknow

unregistriert

6

07.07.2013, 00:20

Besser? Ist halt jetzt alles ein bisschen abstrakter mit verschiedenen Algorithmen und (viel toller) verschiedenen Verteilungen :) Aber "besser".. für Anfänger vor allem viel komplizierter..

  • »Caesiumhydroxid« ist der Autor dieses Themas

Beiträge: 26

Wohnort: Dort wo mein PC steht

  • Private Nachricht senden

7

07.07.2013, 09:17

@Fourb:
Deine Theorie hat sich als falsch herausgestellt, denn ich habe auch schon wegen diesem Problem die IDE gewechselt (von Visual Studio 2008 auf 2010)
Du kannst mir aber die Stellen im Code sagen die dich so schokieren, denn ich finde da jetzt nicht soo die großen Fehler

@Evrey:

Ok ich werde es probieren, mal sehen was dabei rauskommt.

Ich denke Allerdings noch immer das sich die rand Funktion ab einem gewissen Zeitpunkt wiederholt -> viermal gespiegeltes Muster im Bild

MFG
Wer Rechtschreibfehler findet, darf sie behalten ;)

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

8

07.07.2013, 10:09

Mal davon abgesehen, dass du non-static Variablen für die Definition der Fenstergröße verwendest, benutzt die Sprites. Sprites sind seit 2.0 ziemlich überflüssig geworden.

Desweiteren könntest du mal einen normalen Standardaufbau eines SFML-Programms verwenden und pro Durchlauf ein Rechteck hinzufügen. Dadurch könntest du mit variablen Zahlen testen, wo der Fehler liegt.

Btw. der Code kompiliert bei mir nicht mal.

Ansonsten, wenn du dir deiner Annahme sicher bist: Mittlerweile hab ich das Gefühl, dass der Anfangswert verschiedenen ist(wie du sagst, verschiedener Anfang - später gleich) und dann immer wieder im gleichen Schema neue int's rausgehauen werden. Benutz mal die Generatoren von C++11.
42 / Pi = 13,37

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

07.07.2013, 10:22

Ich denke Allerdings noch immer das sich die rand Funktion ab einem gewissen Zeitpunkt wiederholt
Ach wirklich? Mit dieser Erkenntnis koenntst du Informatikgeschichte schreiben. Nicht.

rand ist kein "Zufall". Es ist ne ziemlich simple Formel in der Art addiere 2 und multipliziere mit 5. Wegen dem begrenzten Zahlenvorrat, den man abbildet, ist es klar, dass sich das wiederholen muss.

  • »Caesiumhydroxid« ist der Autor dieses Themas

Beiträge: 26

Wohnort: Dort wo mein PC steht

  • Private Nachricht senden

10

07.07.2013, 10:36

Ok ja, das mit den non static Variablen ist in der Tat nicht unbedingt schön. Das mit den Sprites versteh ich jetzt nicht, wieso sollten sie überflüssig geworden sein? Wäre dankbar für einen Hinweis bzw Stichwort, dass ich mir das mal näher ansehen kann.

Die normale SFML-Loop habe ich aus Faulheit draussengelassen weil das ja eh nur dahingecodet ist, habe sich aber jetzt Schönheitshalber eigefügt. (Hatte ich in einer vorherigen Version drinnen, bei Dieser konnte man die Generation des Musters beobachten)

Ok ich werde es nun mit den neuen Generatoren versuchen.

Danke dass du dir die Zeit genommen hast, und mir Verbesserungsvorschläge gibst :thumbsup: , bin noch nicht so erfahren, und solche Dinge helfen ungemein.

@TGGC
Mir war schon klar das es sich irgendwann wiederholt und ich weis auch das es nur Pseudo-Zufallszahlen sind, allerdings dachte ich nicht, dass sie sich nach so kurzer Zeit wiederholen.

Mfg
Caesiumhydroxid

Edit:
Mit den neuen Generatoren funktioniert es :D
Danke euch allen :thumbup:

Hier ein paar neue Bilder:

(Link)


(Link)


(Link)
Wer Rechtschreibfehler findet, darf sie behalten ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Caesiumhydroxid« (07.07.2013, 10:52)


Werbeanzeige