7

小数点以下の数値から得られる確率に基づいて、浮動小数点数を次の整数に丸める方法を探しています。たとえば、浮動小数点数 6.1 は 6 と 7 に丸められます。7 に丸められる確率は 0.1 で、6 に丸められる確率は 1-0.1 です。したがって、この丸め実験を無限に実行すると、すべての整数結果の平均は再び 6.1 になるはずです。そのようなプロシージャの名前があるかどうか、および Python に既に実装された関数があるかどうかはわかりません。もちろん、同様に小数点以下 2 桁まで丸めることができれば非常に便利です。

それは理にかなっていますか?何か案は?

4

6 に答える 6

7

これは、このための優れたワンライナーです。floor 関数を使用すると、0 と 1 の間の乱数が次に高い整数になるのに十分な場合にのみ切り上げられます。この方法は、正の数でも負の数でも同じように機能します。

def probabilistic_round(x):
    return int(math.floor(x + random.random()))

負の入力の場合を考えてみましょうx = -2.25。75% の確率で乱数は 0.25 以上であり、この場合、フロア関数は -2 が答えになります。残りの 25% の時間は、-3 に切り捨てられます。

異なる小数点以下の桁数に丸めるには、次のように変更できます。

def probabilistic_round(x, decimal_places=0):
    factor = 10.0**decimal_places
    return int(math.floor(x*factor + random.random()))/factor
于 2016-12-01T22:31:22.493 に答える
6

非負の x に対してこれを行う最も簡潔な方法は次のとおりです。

int(x + random.random())

たとえば の場合、 を作成するのに十分な大きさになるx == 6.1可能性が 10% あります。random.random()x + random.random() >= 7

が常に [0, 1) の範囲内にあるため、 の場合、この式は必ずをx == 6返すことに注意してください。6random.random()

更新: このメソッドは、非負の入力に対してのみ機能します。負の数で機能するソリューションについては、Chris Locke の回答を参照してください。

于 2016-10-25T20:33:20.643 に答える
2

正の値を整数に丸めるには、これを非常に簡潔に行うことができます。

x = int(x) + (random.random() < x - int(x))

これは、Python のbool型が のサブクラスであるため機能しintます。値Trueは 1 にFalse等しく、0 に等しくなります。

于 2013-09-27T10:54:09.127 に答える
1

また、random の二項関数と shx2 によって既に提供されているコードに基づく解決策も思いつきました。

def prob_round(x, prec = 0):
    fixup = np.sign(x) * 10**prec
    x *= fixup 
    round_func = int(x) + np.random.binomial(1,x-int(x))
    return round_func/fixup
于 2013-09-27T10:14:58.003 に答える