Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用“随机”时,哪种形式的概率等于50%?_Python_Random - Fatal编程技术网

Python 使用“随机”时,哪种形式的概率等于50%?

Python 使用“随机”时,哪种形式的概率等于50%?,python,random,Python,Random,我猜大多数内置的随机生成器都会返回这样的结果: [0.0, 1.0) if random() < .5 所以,如果我想要50%的机会,我会用这样的方法: [0.0, 1.0) if random() < .5 if random()

我猜大多数内置的随机生成器都会返回这样的结果:

[0.0, 1.0)
if random() < .5
所以,如果我想要50%的机会,我会用这样的方法:

[0.0, 1.0)
if random() < .5
if random()<.5
或者类似于:

if random() <= .5

if random()没关系。这两个公式都能得到所需的结果。

对于一级近似值,两个公式都有效

最好的方法是选择一个随机生成器,它专门发出布尔值或带范围的整数。然后你就可以准确地确定范围了

像浮点“相等”这样的运算无论如何都是不确定的。

if random()<.5
 if random() < .5
在二进制中,.5是.1000000000。。。。 因此,基本上,问题归结为,“小数点后的第一个二进制数字是什么…0(对于
<.5

但前提是您的浮点支持足以满足精度要求(因为它从来都不是精确的)。

如果我想要50%的概率,我只需要检查LSB(最低有效位)。

啊,旧的“.5”问题。答案如下:


如果你要把10件事情分成两个相等的部分,那么每一部分需要5件事情。第一部分从0到4,第二部分从5到9。所以…
<0.5
是正确的。

对于一个特定的系统,如果你真的想知道的话,你应该测试它。不过可能需要一段时间:-)

我同意其他海报的说法,对于第一个订单来说,这并不重要。如果真的重要,你无论如何都需要一个更好的RNG


编辑:我刚刚尝试了C#中的默认RNG,尝试次数为100000000次,答案完全相同……

如果你需要真正的随机数,你可以尝试。它们提供了一个连接到设备的web服务,可以检测来自宇宙的噪音。从技术上讲,这仍然不是随机的,但我猜已经足够接近了


他们有各种各样的方式来进行查询,比如黑白图像。

如果你对随机数如此挑剔,不要依赖任何内置的东西。从你信任的地方获得一份记录良好的RNG(我信任Boost,不管它值多少钱),并阅读文档。过去,标准RNG是出了名的糟糕,我仍然不相信他们

或者,使用一个整数RNG,它给出一个范围内的离散值,并将该范围一分为二。根据我的经验,RNG是整数,浮点函数只需除以该范围的顶部

当然,如果这是真的,你已经得到了答案。如果整数RNG产生0、1、2和3,则浮点等价物将是0.0、0.25、0.5和0.75,因此答案是测试<0.5


如果RNG不是基于整数计算的,那么它是基于浮点计算的,因此是不精确的。在这种情况下,您是否测试为什么自己测试并不重要?Python有随机选项:)


random.choice([0,1])将为您提供同等机会的0/1——它是Python的标准部分,由编写random.random的人编写(因此比其他人更了解其语义)问题是:给出的两个if语句中的哪一个有50%的可能性是真的?你知道Python中有什么返回随机布尔值吗?对于Python,考虑使用一个“真”。随机数生成器库。例如:也就是说,如果这种精度对您很重要,您应该使用真正的库,而不是内置的。@Casey:您可以使用:random.choice((True,False))也可以查看该模块中的randint和randrange函数。您正在对浮点表示法进行假设。你认为它是定点的吗?因为您对表示的描述不正确,例如,对于Java或C#。谁说了关于数据表示的内容?在二进制中,二分之一是“0.10000…”,与十进制中的“0.5”和十六进制中的“0.8”完全相同。在这里,我们选择如何将其存储在字节中是无关紧要的。恭喜!你证明了你上过学,在花车里做一个真正的均匀分布是很棘手的。[0-.5]范围内的可表示数字比[5-1]范围内的可表示数字多得多,因此上部区域的数字往往会聚集在一起。当然,这是一个微妙的区别。实际上,一半可以用二进制表示。但这并不能保证它是正确的。根据数字上的数学类型,它可能会四舍五入为.49999999999999什么数学?我们讨论的是编译器将字符串“.5”正确转换为二进制值的能力。如果它不能做到这一点,编译器就彻底崩溃了。为什么你会相信它能将“123”转换成一个整数二进制值呢?我一直认为.5是一个占位符,尽管这可能是没有理由的。我猜“可能需要一段时间”是许多人来堆栈溢出而不是试图凭经验来确定事情的原因!不对。分布点位于.4(9)~.5边界的两侧。加油!就所有实际用途而言,两个公式之间的差异可以忽略不计。所有实际用途?!也许,除非你疯狂地要求两件事发生的概率是50:50,而不是40:60。这取决于精度——如果你生成的数字是0.x,那么它会给出40:60,但是如果你生成的是0.xyzabcfghjkltyuqwertyuip,那么它会接近50:50。为什么这个答案被否决了?仅从数学美的角度来看,您正在将[0,1]拆分为[0,0.5]和[0,0.5][0.5,1)。对于实数,使用哪种比较并不重要,因为精确选择0.5的概率为零。对于计算机中的浮点或双精度数,如果使用“随机”,则意味着不需要加密强位,因此所选的近似值为d将数据类型转换为实数远远不够,因此t