【问题标题】:How to span the range in random function Python? [closed]如何跨越随机函数Python中的范围? [关闭]
【发布时间】:2021-04-12 09:13:39
【问题描述】:

我想得到一个0到1e-20之间的随机数,我在Python中使用如下函数

random.uniform(1e0, 1e-20)

但是,数字仅来自 1e0,缺少范围的其余部分,例如 1e-12、1e-9 等。

如何在所有范围内得到一个数字?

更新:

0.8997498299014705
0.8320065922653802
0.9894039561126263
0.015205024292817781
0.8460417648041141
0.9744256248957714
0.10799180387896301
0.195940099219041
0.19830039605178706
0.694803475206833
0.5869371229317706
0.5762011063374192
0.2761909685255569
0.9757648088382384
0.0786057337977103
0.7090714156637489
0.6946835664286121
0.5975036696040513
0.7426259364954565
0.1116434886497456
0.6691228131282176

【问题讨论】:

  • 这按预期工作,返回 1e-20 和 1 之间的数字。您期望什么不同的输出?请注意,输出小于 1e-12 的概率接近 1e-12,因此不要期望经常看到该量级的输出...
  • 我已经用一些输出更新了帖子。您可以观察到值如何比 1e-20 更接近 1e0,我预计会有各种值“小数位置变化”
  • 那么你不想要均匀分布。在这种情况下,您应该明确说明您想要获得哪种分布。
  • 有无数种可能的随机分布(例如,参见一些非常常见的here)。您显然不想要一个统一的,但如果您不解释,我们无法猜测您希望如何分配随机数。
  • 这正是均匀分布的本质,这正是你得到如此少非常小的值的原因,因为使它们均匀分布的概率当然非常低。因此,正如已经解释的那样,您显然不想要均匀分布,cover all the range with the same probability 的意思并不是“相同概率”在概率中的含义。所以,请解释一下你的确切意思。

标签: python random


【解决方案1】:

正如其他人在 cmets 中指出的那样,您的代码执行您声称想要的,但您想要的似乎与您声称的不同。

您似乎想要生成随机数,使其以 10 为底的对数均匀分布在 -20 和 0 之间。这样的数字称为 log-uniform 而不是均匀分布。如果是这样 - 只需在 [-20,0] 中统一生成指数,然后将 10 提高到这些数字:

import random

for i in range(10):
    print(pow(10,random.uniform(-20,0)))

#typical output:

0.0005139787035284368
1.1615946347073329e-14
2.455360025929292e-07
1.615010435306129e-14
0.007962057074320813
1.1641947007189282e-17
3.725480259325438e-18
3.5028054406435525e-09
1.4739445873699184e-11
2.322173584509162e-16

【讨论】:

    【解决方案2】:

    根据numpy docs for uniform,概率公式为 [a=1e0,b=1-20e] 区间内的 p(x)=1/(b-a)。这意味着概率将始终为 -1,因为 b 非常接近于零,就像将 1 除以 -1。如果你交换 and 和 b 它变成+1。不知何故,这导致输出仅在 1 和 0 之间。

    使用以下代码进行测试:

    import numpy as np
    from matplotlib import pyplot as plt
    
    test = np.random.uniform(1e0, 1e-20, 500)
    
    plt.hist(test, bins=50, density=True)
    plt.show()
    

    【讨论】:

    • 我该如何解决我的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多