uniform(0, 1)
は生産でき0
ますが、生産されることはありません1
。
ドキュメントには、エンドポイントがあることがわかりますb
可能性が生成された値に含まれます。
b
式の浮動小数点の丸めに応じて、終点の値が範囲に含まれる場合と含まれない場合がありますa + (b-a) * random()
。
したがってuniform(0, 1)
、の式は0 + (1-0) * random()
、に簡略化され1 * random()
、1
正確に生成できる必要があります。それrandom.random()
は1.0 exactly. However,
random()*never* produces
1.0`の場合にのみ発生します。
random.random()
ドキュメントの引用:
[0.0、1.0)の範囲の次のランダムな浮動小数点数を返します。
表記[..., ...)
は、最初の値がすべての可能な値の一部であることを意味しますが、2番目の値はそうではありません。random.random()
ほとんどの農産物値で意志非常に近くに1.0
。Pythonのfloat
タイプは、IEEE 754 base64浮動小数点値であり、値を構成する2進分数(1 / 2、1 / 4、1 / 5など)をエンコードします。値がrandom.random()
生成するのは、単に2 ** -1
(1/2)から2 ** -53
(1/9007199254740992)までの53のそのようなフラクションのランダムな選択。
ただし、に非常に近い値が生成される可能性があるため1.0
、浮動小数点ナブマーを乗算したときに発生する丸め誤差とともに、およびの一部の値に対して生成できます。しかし、これらの価値観には含まれていません。b
a
b
0
1
は0.0 random.random()
を生成できるためa
、random.uniform()
(a + (b - a) * 0 == a
)の可能な値に常に含まれていることに注意してください。生成さ2 ** 53
れるrandom.random()
可能性のあるさまざまな値(53の2進数のすべての可能な組み合わせ)があるため、これが発生する可能性は2 ** 53
1インチ(9007199254740992に1倍)です。
したがって、random.random()
生成できる最大値は1 - (2 ** -53)
です。十分に小さい値を選択するだけでb - a
、より高いrandom.random()
値を掛けたときに丸めが有効になります。小さいほどb - a
、それが発生する可能性が高くなります。
>>> import random, sys
>>> def find_b():
... a, b = 0, sys.float_info.epsilon
... while random.uniform(a, b) != b:
... b /= 2
... else:
... return b
...
>>> print("uniform(0, {0}) == {0}".format(find_b()))
...
uniform(0, 4e-323) == 4e-323
をb = 0.0
押すと、1023回の除算が行われます。上記の値は、1019回の除算でラッキーになったことを意味します。私がこれまでに見つけた最高の値(上記の関数をループで実行max()
)は8.095e-320
(1008目盛)ですが、おそらくもっと高い値があります。それはすべて偶然のゲームです。:-)
それはまたの間にはない多くの離散的なステップがある場合に発生する可能性がありますa
とb
、ときのようにa
してb
高い指数を持っており、これまでのところ、アパートのように見えることがあります。浮動小数点値はまだ近似値に過ぎず、エンコードできる値の数は有限です。例えば、差のわずか1バイナリ画分が存在するsys.float_info.max
とsys.float_info.max - (2 ** 970)
、そう50-50可能性があるrandom.uniform(sys.float_info.max - (2 ** 970), sys.float_info.max)
作り出しますsys.float_info.max
。
>>> a, b = sys.float_info.max - (2 ** 970), sys.float_info.max
>>> values = [random.uniform(a, b) for _ in range(10000)]
>>> values.count(sys.float_info.max) # should be roughly 5000
4997
X ~ U(0,1)
、xのすべての値について、P(X=x)
はほぼ確実に 0です。(間隔で無限に多くの可能な値があるためです。)あなたは正確に0または1を探しているなら、あなたは、例えば、異なる機能-使用する必要がありますrandom.choice