Seite 1 von 4
Ist Random doch nicht Random?
Verfasst: 26.11.2007 17:41
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.
Verfasst: 26.11.2007 17:47
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
Verfasst: 26.11.2007 17:59
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.
Verfasst: 26.11.2007 18:41
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.
Verfasst: 26.11.2007 18:42
von Zaphod
Warum, dafür gibt es keinen vernünftigen Grund?
Durch mehrfaches anwenden von RandomSeed werden deine Werte nicht zufälliger.
Verfasst: 26.11.2007 18:51
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.

Verfasst: 26.11.2007 19:17
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

).
Verfasst: 26.11.2007 19:19
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
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
Verfasst: 26.11.2007 19:20
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
Verfasst: 26.11.2007 19:41
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.