uniform_real_distribution
‚s Konstruktor erfordert:
a ≤ b
und b − a ≤ numeric_limits<RealType>::max()
.
Die letzten für Sie nicht möglich ist, da die Differenz zwischen lowest
und max
per Definition größer als max
sein muss (und INF an Sicherheit grenzender Wahrscheinlichkeit sein wird).
Es gibt mehrere Möglichkeiten, dies zu beheben. Das einfachste ist, wie Nathan hervorhob, nur eine uniform_real_distribution<double>
zu verwenden. Sofern double
für Ihre Implementierung den Bereich float
nicht speichern konnte (und IEEE-754 Float64 kann den Bereich von Float32 speichern), sollte dies funktionieren. Sie würden immer noch die numeric_limits
für eine float
übergeben, aber da die Verteilung double
verwendet, kann es die Mathematik für die erhöhte Reichweite behandeln.
Alternativ können Sie eine uniform_real_distribution<float>
mit einer booleschen uniform_int_distribution
kombinieren (dh eine, die zwischen 0 und 1 auswählt). Ihre tatsächliche Verteilung sollte über den positiven Zahlen liegen, bis zu max
. Jedes Mal, wenn Sie eine Nummer aus der echten Distribution erhalten, erhalten Sie auch eine aus der int-Distribution. Wenn die Ganzzahl 1 ist, negiere den reellen Wert.
Dies hat den Nachteil, die Wahrscheinlichkeit von Null etwas höher als die Wahrscheinlichkeit anderer Zahlen zu machen, da positive und negative Null das Gleiche sind.
Wäre es auch akzeptabel, eine "uniform_real_distribution" zu verwenden, solange behauptet wird, dass "sizeof (double)> = 2 * sizeof (float)"? –
NathanOliver
@NathanOliver: Guter Punkt. –