gpt4 book ai didi

python - 使用近似生成均匀分布的位

转载 作者:行者123 更新时间:2023-11-28 21:51:11 26 4
gpt4 key购买 nike

我正在尝试使用 random.uniform 而不是 random.getrandbits 以 50/50 的几率生成 0 或 1。

这是我的

0 if random.uniform(0, 1e-323) == 0.0 else 1

但是,如果我运行足够长的时间,则生成 1 的平均值约为 70%。如下所示:

sum(0 if random.uniform(0, 1e-323) == 0.0 
else 1
for _ in xrange(1000)) / 1000.0 # --> 0.737

如果我将其更改为 1e-324,它将始终为 0。如果我将其更改为 1e-322,则平均值将为 ~%90。

我做了一个肮脏的程序,它会通过多次除法和乘法来尝试找到 1e-322 和 1e-324 之间的最佳点:

v = 1e-323
n_runs = 100000
target = n_runs/2

result = 0
while True:
result = sum(0 if random.uniform(0, v) == 0.0 else 1 for _ in xrange(n_runs))

if result > target:
v /= 1.5
elif result < target:
v *= 1.5 / 1.4
else:
break

print v

最后是 4.94065645841e-324

但如果我运行足够多,它仍然会出错。

没有我写的肮脏脚本,我有办法找到这个号码吗?我知道 Python 有一个实习生最小浮点值,显示在 sys.float_info.min 中,在我的 PC 中是 2.22507385851e-308。但我不知道如何使用它来解决这个问题。

很抱歉,如果这感觉更像是一个谜题而不是一个正确的问题,但我自己无法回答。

最佳答案

I know that Python has a intern min float value, show in sys.float_info.min, which in my PC is 2.22507385851e-308. But I don't see how to use it to solve this problem.

2.22507385851e-308 不是最小正浮点值,它是最小正标准化 浮点值。最小的正浮点值是它的2-52倍,也就是5e-324附近。

2-52 被称为“机器 epsilon”,通常将浮点类型的“min”称为所有可比值中最小的值(即 -inf),也不是有限值中的最小值(即 -max),也不是正值中的最小值。

然后,您面临的下一个问题是 random.uniform 不统一到那个级别。当你传递一个规范化的数字时它可能工作正常,但如果你传递给它最小的正可表示 float ,它在内部使用它进行的计算可能非常近似并导致它的行为与文档中所说的不同。尽管根据您的“脏脚本”的结果,它似乎工作正常。

关于python - 使用近似生成均匀分布的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com