Ist Random doch nicht Random?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Ist Random doch nicht Random?

Beitrag von Gubbie247 »

Hallo.
Ich versuche gerade Perlinrauschen zu programmieren. Dafür braucht man reproduzierbare (für den selben Koordinaten, den selben Zufallswert) zufälige Zahlen. Nun habe ich gedacht, nehm ich doch Randomseed.

Code: Alles auswählen

For i = 0 To 100
  RandomSeed(i)
  Debug RSet("w",Random(10),"-")
Next
Aber der Code gibt bei mir ein Zackenmuster (die Werte steigen und falen dann wieder auf 0, liegt das an meinem Computer?), also ist RandomSeed ungeeignet, denn die Werte sollen je zufällig und nicht ansteigend sein.
Gibt es hier eine schöne Alternative und warum funktioniert RandomSeed nicht wie erwartet?
Vielen Dank.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

die zacken liegen eher am code
tu mal so machen:

Code: Alles auswählen

RandomSeed(1)
For i = 0 To 10 
  Debug RSet("w",Random(20),"-") 
Next
Zuletzt geändert von bobobo am 27.11.2007 20:29, insgesamt 1-mal geändert.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Beitrag von Gubbie247 »

aber ich will ja eben verschiedene randomSeeds haben, abhängig von einem wert (in dem Fall i) soll eine 'Zufalls'zahl erzeugt werden.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

warum funktioniert RandomSeed nicht wie erwartet?
RandomSeed funktioniert so: Du gibst eine Zahl als Seed an, und diese Zahl wird als Parameter einer Zufalls-Funktion verwendet, die so krass ist, daß scheinbar (!) zufällige Zahlen herauskommen.

Das bedeutet aber auch, daß wenn Du heute als Seed die Zahl "53" nimmst, die Reihenfolge der Zufallszahlen genau gleich sind, wie wenn Du morgen wieder "53" nimmst.
Und da Du in Deinem Code immer die Seeds 0 bis 100 benutzt, und danach immer gleich die erste Zahl nimmst, die bei Random(10) herauskommt, ist es auch völlig logisch, daß es jedesmal die gleichen Zahlen sind, die herauskommen.

Auf der anderen Seite willst Du ja reproduzierbare Werte haben. Vielleicht kannst Du ja einfach mal Dein Problem noch genauer erklären, dann kann man Dir vielleicht eher weiterhelfen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Warum, dafür gibt es keinen vernünftigen Grund?
Durch mehrfaches anwenden von RandomSeed werden deine Werte nicht zufälliger.
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Beitrag von Gubbie247 »

ZeHa hat geschrieben:... ist es auch völlig logisch, daß es jedesmal die gleichen Zahlen sind, die herauskommen.
das ist es ja!! es SOLLEN die selben Zahlen sein, nur nicht ansteigend. Es gibt doch keinen Grund dafür, warum der erste Randomwert nach RandomSeed(1) in irgendeinem Zusammenhang stehen sollte mit dem nach RandomSeed(2). Doch er tut es, er ist größen (Zackenmuster). Ich möchte aber keine Ansteigenden, sondern Pseudozufällige Zahlen (immer die selben!) haben. Hoffentlich war das klarer. :)
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Naja in dem Fall hast Du wohl das Pech, daß die jeweils ersten Zufallszahlen für die Seeds von 0 bis 100 eben so ein ansteigendes Muster haben. Ansonsten versuch doch mal nicht Random(10) sondern Random(500) und teile hinterher die Zahl durch 50. Normalerweise müßten dann andere Zahlen rauskommen (kann aber auch sein, daß ich mich irre, hab aber grad keine Zeit das auszuprobieren ;) ).
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Little John

Beitrag von Little John »

Wenn man 1x RandomSeed() aufruft, und danach mehrmals Random(), dann sind die Werte innerhalb dieser Serie pseudozufällig verteilt. Wenn man das ein zweites Mal macht, hat man eine zweite Serie von Pseudozufallszahlen.
Dein Code zu Beginn dieses Threads produziert aber keine einzige Serie von Pseudozufallszahlen, denn pro Aufruf von RandomSeed() wird anschließend nur 1x Random() aufgerufen. Anders ausgedrückt: Nicht wiederholte Aufrufe von

Code: Alles auswählen

RandomSeed()
Random()
erzeugen Pseudozufallszahlen, sondern man erhält diese durch initial 1 Aufruf von RandomSeed(), gefolgt von wiederholten Aufrufen von Random() -- wie es bobobo gemacht hat. Wenn Dir eine Serie nicht reicht, kannst Du es so machen:

Code: Alles auswählen

For k = 0 To 5
   RandomSeed(k)
   For i = 0 To 10
     Debug RSet("w",Random(20),"-")
   Next
Next
Gruß, Little John
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

zur veranschaulichung

Code: Alles auswählen

For s=1 To 3
RandomSeed(s) 
For i = 0 To 5 
  Debug "Seed "+Str(s)+"::"+RSet("w",Random(20),"- ")
Next
Next
Debug "---------"
For s=3 To 1 Step -1
RandomSeed(s) 
For i = 0 To 5 
  Debug "Seed "+Str(s)+"::"+RSet("w",Random(20),"- ")
Next
Next

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Gubbie247
Beiträge: 32
Registriert: 10.10.2004 13:23

Beitrag von Gubbie247 »

das problem hier ist aber die geschwindigkeit. ich kann ja nicht für die koordinate (10395,432) 10827 mal einen RandomBefehl ausführen, deshalb suche ich ja eine Alternative.

Besonders merkwürdig finde ich halt, dass offenbar der erste Randomwert mit dem Seedwert in zusammenhang steht, ich sehe da keinen Grund dafür? Deshalb ist es so schwierig.
Antworten