Zufällig, aber höchstwahrscheinlich 1 float

8

Ich möchte einen Float randomisieren, der so

ist
  • Es besteht eine 95% ige Chance, ungefähr 1
  • zu sein
  • Es gibt eine Chance von 0,01%, & lt; 0,1 oder & gt; 1.9
  • Es wird niemals 0 oder 2

Ist dies möglich, indem Sie beispielsweise Random.nextFloat() mehrmals verwenden?

Eine visuelle Darstellung der Wahrscheinlichkeit:

    
Solver42 06.02.2016, 05:23
quelle

2 Antworten

7

Sie müssen eine Funktion f finden, so dass:

  1. f ist stetig und erhöht sich um [0, 1]

  2. f (0) & gt; 0 und f (1) & lt; 2

  3. f (0,01) & gt; = 0,1 und f (0,99) & lt; = 1,9

  4. 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:

%Vor%

Die Wahrscheinlichkeit wird wie folgt verteilt:

    
Daniel Martin 06.02.2016 08:02
quelle
2

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:

  1. Definitionen

    Nehmen wir an, wir haben den Pseudozufallsgenerator Random.nextFloat() , der Werte im Bereich <0,1> mit gleichmäßiger Verteilung zurückgibt.

  2. 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.

  3. 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.

    
Spektre 06.02.2016 08:08
quelle

Tags und Links