Zufallszahl abhaengig von Variable
-
Mahlzeit,
das normale rand() liefert ja einfach nur Zufallszahlen unabhaenig von irgend einer anderen Groesse (abgesehen vom seed).
Ich brauche ein rand(), das Zufallswerte erzeugt, allerdings abhaengig von einem float Uebergabeparameter. Bei 2 Aufrufen mit dem selben Parameter soll die selbe Zufallszahl zurueckgegeben werden. Beispiel:float random(float param); // Liefert Zufallszahl in [0,1] ... float r; r = random(208.22); // Liefert willkuerlich 0.56 r = random(50.89); // Liefert willkuerlich 0.314 r = random(100); // Liefert willkuerlich 0.89 r = random(208.22); // Liefert wieder 0.56Wie koennte man sowas machen?
-
Dann hat das ja nicht mehr viel mit Zufall zu tun.
Willst du einen Hash? Dann wäre vielleicht TR1.Hash (oder Boost.Hash) etwas für dich.
-
Nexus schrieb:
Dann hat das ja nicht mehr viel mit Zufall zu tun.
Wieso?
Wuerde ich den Graphen G = {(p, random(p))} plotten, waere das eine total willkuerlich gezackte Kurve. Nur halt 2 Parameter sollen den selben Random wert liefern.
-
float s = 208.22f; std::stand(static_cast<unsigned int>(s*100)); float r = (std::rand()%10000) / 100.f
-
asdfdsfsdf schrieb:
float s = 208.22f; std::stand(static_cast<unsigned int>(s*100)); float r = (std::rand()%10000) / 100.fIch denke das sollte gehen. Die 10000 waren dann quasi mein Maximalwert des Parameters. Einziger "Nachteil" waere, dass ich fuer jede Zufallsvariable einmal srand() aufrufen muesste. Ist der Aufruf von srand() teuer oder geht das fix?
-
Ah, dann willst du eine Art verrauschter Zufallsprozess, wobei
paramdann der Zeitpunkt ist. Wenn die Anzahl möglicher Zeitpunkte endlich ist (und einigermassen klein), könntest du auch ein Array vorberechnen.Ich bin mir nicht sicher, wie gut die Eigenschaften des linearen Kongruenzgenerators hier sind (ob man etwas von der Abhängigkeit nacheinanderfolgender Zufallszahlen merkt). Fest steht jedoch, dass die Auflösung von s mit asdfdsfsdfs Code nur 0.01 ist (d.h. Werte, die sich um weniger unterscheiden, führen u.U. zur gleichen Zufallszahl).
-
Nexus schrieb:
Ah, dann willst du eine Art verrauschter Zufallsprozess, wobei
paramdann der Zeitpunkt ist. Wenn die Anzahl möglicher Zeitpunkte endlich ist (und einigermassen klein), könntest du auch ein Array vorberechnen.Ja, das war auch mein 1. Gedanke. Das Intervall kenne ich genau [0,n], n is maximal so um die 4000 gross. Dann ein Array mit Zufallswerten fuellen und mit Parameter p dann zwischen den 2 naheliegendsten linear interpolieren.
Nexus schrieb:
Ich bin mir nicht sicher, wie gut die Eigenschaften des linearen Kongruenzgenerators hier sind (ob man etwas von der Abhängigkeit nacheinanderfolgender Zufallszahlen merkt). Fest steht jedoch, dass die Auflösung von s mit asdfdsfsdfs Code nur 0.01 ist (d.h. Werte, die sich um weniger unterscheiden, führen u.U. zur gleichen Zufallszahl).
Das wuerde nichts ausmachen. Das einzig wichtige is, dass gleiche Paramter zum gleichen Zufallswert fuehren.
-
asdfdsfsdf schrieb:
float s = 208.22f; std::stand(static_cast<unsigned int>(s*100)); float r = (std::rand()%10000) / 100.fMir ist gerade aufgefallen, dass der Code Quatsch ist. So muss der Code aussehen:
float s = 208.22f; std::stand(static_cast<unsigned int>(s*100)); float r = std::rand() / (float)RAND_MAX;
-
Dann ein Array mit Zufallswerten fuellen und mit Parameter p dann zwischen den 2 naheliegendsten linear interpolieren.
Wo macht die lineare Interpolation zwischen zufälligen Punkten Sinn?
-
Eisflamme schrieb:
Dann ein Array mit Zufallswerten fuellen und mit Parameter p dann zwischen den 2 naheliegendsten linear interpolieren.
Wo macht die lineare Interpolation zwischen zufälligen Punkten Sinn?
Ich hoffe die Frage ist nicht ernst gemeint...

-
Zufaller schrieb:
Das wuerde nichts ausmachen. Das einzig wichtige is, dass gleiche Paramter zum gleichen Zufallswert fuehren.
Genau das macht doch seed beim normalen rand... Bei gleichem seed kommt auch die identische Kette von Zufallszahlen raus... Darum ist rand ja auch ein Pseudo-Zufallszahlengenerator und kein echter...
-
loks schrieb:
Zufaller schrieb:
Das wuerde nichts ausmachen. Das einzig wichtige is, dass gleiche Paramter zum gleichen Zufallswert fuehren.
Genau das macht doch seed beim normalen rand... Bei gleichem seed kommt auch die identische Kette von Zufallszahlen raus... Darum ist rand ja auch ein Pseudo-Zufallszahlengenerator und kein echter...
-
Zufaller schrieb:
Ich hoffe die Frage ist nicht ernst gemeint...

Zufaller schrieb:
Wenn man Hilfe sucht, darf man sich ruhig auch ein wenig um einen freundlichen Ton bemühen...
-
Nexus schrieb:
könntest du auch ein Array vorberechnen.
Warum vorberechnen? Ich würds berechnen, wenns nötig ist und dann nach dem Berechnen in einem Array abspeichern.
-
pumuckl schrieb:
Warum vorberechnen? Ich würds berechnen, wenns nötig ist und dann nach dem Berechnen in einem Array abspeichern.
Naja, kommt halt drauf an, ob sich das Caching lohnt. Wenn man sowieso auf die Werte zugreift, kann man sich so die If-Abfrage bei jedem Zugriff sparen.