Ich möchte einen Float randomisieren, der so
ist Ist dies möglich, indem Sie beispielsweise Random.nextFloat()
mehrmals verwenden?
Eine visuelle Darstellung der Wahrscheinlichkeit:
Sie müssen eine Funktion f finden, so dass:
f ist stetig und erhöht sich um [0, 1]
f (0) & gt; 0 und f (1) & lt; 2
f (0,01) & gt; = 0,1 und f (0,99) & lt; = 1,9
f (x) ist "ungefähr 1" für 0,025 & lt; = x & lt; = 0,975
Und dann nimm einfach f(Random.nextDouble())
Zum Beispiel passt Math.tan(3*(x-0.5))/14.11
dazu, also würde ich für Ihren Ausdruck Folgendes verwenden:
Die Wahrscheinlichkeit wird wie folgt verteilt:
Ich code nicht in JAVA , aber wenn ich den internen Pseudozufallsgenerator verwenden möchte (ich verwende normalerweise verschiedene Ansätze dafür), würde ich es so machen:
Definitionen
Nehmen wir an, wir haben den Pseudozufallsgenerator Random.nextFloat()
, der Werte im Bereich <0,1>
mit gleichmäßiger Verteilung zurückgibt.
Erstellen Sie ein Mapping von der Uniform <0,1>
auf Ihre (0,2)
Es wäre etwa so:
DIE 0.001 SOLLTE 0.0001 SEIN! Ich habe gelehrt, dass es 0.1% statt 0.01% beim Zeichnen war ...
Nennen wir es f(x)
. Es kann eine Tabelle sein (stückweise Interpolation) oder ein Polynom konstruieren, das mit den von Ihnen benötigten Eigenschaften übereinstimmt ( BEZIER , Interpolationspolynome, ...)
Wie Sie sehen können, ist die x
Achse die Wahrscheinlichkeit und die y
Achse ist der pseudo-zufällige Wert (in Ihrem Bereich). Da eingebaute Pseudozufallsgeneratoren einheitlich sind, erzeugen sie gleichmäßig verteilte Zahlen zwischen <0,1>
, die direkt als x
verwendet werden können.
Um die 0.0
und 2.0
zu vermeiden, werfen Sie sie weg oder verwenden Sie das Intervall <0.0+ulp,2.0-ulp>
, wobei ulp die Einheit an letzter Stelle ist
Das Diagramm ist in Farbe gezeichnet und besteht aus 2x kubischen BEZIER (4 Kontrollpunkte pro Kubik) und einer einzelnen Linie.
Konvertieren Sie jetzt einfach die Bereiche
Ihr Pseudozufallswert ist also:
%Vor%[Hinweise]
Das wäre besser bei Festkomma-Formatnummern, ansonsten müssen Sie die Krümmungen wahnsinnig hoch machen, um irgendeinen Effekt zu erzielen, oder sehr große Datenmenge verwenden, um die gewünschte Wahrscheinlichkeitsausgabe zu erreichen.