如何随机生成真正的小数字?

时间:2017-04-11 15:47:55

标签: python python-3.x numpy random

假设我想在[10 ^ -20,0.1]范围内绘制一个随机数,我该怎么做?

如果我使用numpy.random.uniform,我似乎不会低于10 ^ -2:

In [2]: np.random.uniform(0.1, 10**(-20))
Out[2]: 0.02506361878539856

In [3]: np.random.uniform(0.1, 10**(-20))
Out[3]: 0.04035553250149768

In [4]: np.random.uniform(0.1, 10**(-20))
Out[4]: 0.09801074888377342

In [5]: np.random.uniform(0.1, 10**(-20))
Out[5]: 0.09778150831277296

In [6]: np.random.uniform(0.1, 10**(-20))
Out[6]: 0.08486347093110456

In [7]: np.random.uniform(0.1, 10**(-20))
Out[7]: 0.04206753781952958

或者我可以生成一个数组,而不是:

In [44]: fac = np.linspace(10**(-20),10**(-1),100)

In [45]: fac
Out[45]: 
array([  1.00000000e-20,   1.01010101e-03,   2.02020202e-03,
         3.03030303e-03,   4.04040404e-03,   5.05050505e-03,
         6.06060606e-03,   7.07070707e-03,   8.08080808e-03,
         9.09090909e-03,   1.01010101e-02,   1.11111111e-02,
         1.21212121e-02,   1.31313131e-02,   1.41414141e-02,
         1.51515152e-02,   1.61616162e-02,   1.71717172e-02,
         1.81818182e-02,   1.91919192e-02,   2.02020202e-02,
         2.12121212e-02,   2.22222222e-02,   2.32323232e-02,
         2.42424242e-02,   2.52525253e-02,   2.62626263e-02,
         2.72727273e-02,   2.82828283e-02,   2.92929293e-02,
         3.03030303e-02,   3.13131313e-02,   3.23232323e-02,
         3.33333333e-02,   3.43434343e-02,   3.53535354e-02,
         3.63636364e-02,   3.73737374e-02,   3.83838384e-02,
         3.93939394e-02,   4.04040404e-02,   4.14141414e-02,
         4.24242424e-02,   4.34343434e-02,   4.44444444e-02,
         4.54545455e-02,   4.64646465e-02,   4.74747475e-02,
         4.84848485e-02,   4.94949495e-02,   5.05050505e-02,
         5.15151515e-02,   5.25252525e-02,   5.35353535e-02,
         5.45454545e-02,   5.55555556e-02,   5.65656566e-02,
         5.75757576e-02,   5.85858586e-02,   5.95959596e-02,
         6.06060606e-02,   6.16161616e-02,   6.26262626e-02,
         6.36363636e-02,   6.46464646e-02,   6.56565657e-02,
         6.66666667e-02,   6.76767677e-02,   6.86868687e-02,
         6.96969697e-02,   7.07070707e-02,   7.17171717e-02,
         7.27272727e-02,   7.37373737e-02,   7.47474747e-02,
         7.57575758e-02,   7.67676768e-02,   7.77777778e-02,
         7.87878788e-02,   7.97979798e-02,   8.08080808e-02,
         8.18181818e-02,   8.28282828e-02,   8.38383838e-02,
         8.48484848e-02,   8.58585859e-02,   8.68686869e-02,
         8.78787879e-02,   8.88888889e-02,   8.98989899e-02,
         9.09090909e-02,   9.19191919e-02,   9.29292929e-02,
         9.39393939e-02,   9.49494949e-02,   9.59595960e-02,
         9.69696970e-02,   9.79797980e-02,   9.89898990e-02,
         1.00000000e-01])

并从该数组中选择一个随机元素,但无论如何都想澄清第一个选项是否可行,因为我可能遗漏了一些明显的东西。

5 个答案:

答案 0 :(得分:3)

你需要仔细思考你正在做什么。你要求几乎在0.0和0.1之间的均匀分布。平均结果为0.05。这正是你得到的。您似乎想要随机分配指数。

以下可能会做您想做的事:

id

输出:

import random

def rnd():
    exp = random.randint(-19, -1)
    base = 0.9 * random.random() + 0.1
    return base * 10**exp

[rnd() for _ in range(20)]

答案 1 :(得分:2)

如何生成1到10 000之间的随机数, 然后将这个数字除以10万。

答案 2 :(得分:2)

根据numpy文档:

low:float或array_like浮点数,可选 输出间隔的下限。生成的所有值都将大于或等于低。默认值为0.

考虑到这一点,减少low的值会产生较低的数字

>>> np.random.uniform(0.00001, 10**(-20))
6.390804027773046e-06

答案 3 :(得分:0)

由于您希望保持均匀分布并避免与浮点表示相关的问题,因此只需在0到9之间均匀地绘制20个整数,并使用基数10表示“构建”您的结果(您仍将具有均匀分布):< / p>

string xlsxFile = "file.xlsx"
var isMatched = xlsxFile.WildCardMatch(pattern)

这将为您提供0到10 ** 19 -1之间的数字。您可以不同地解释结果以获得您想要的结果。

答案 4 :(得分:0)

如果在[0,0.1]范围内生成均匀随机数,则随机数小于10 ^ -20的可能性是10 ^ -19中的一个。它可能永远不会发生。但是,如果您 以确保不能发生(可能因为较小的数字会导致代码崩溃),那么只需生成[0]范围内的均匀随机数。 ,0.1,测试它们,并通过用同一个发生器中的另一个均匀随机数替换它们并重新测试来拒绝任何太小的。这取代了“非常不可能”的“肯定永远不会发生”。

这种技术在蒙特卡罗模拟中更常见,您希望随机抽样f(x,y)或f(x,y,z),其中坐标(x,y [,z])必须在某些具有复杂定义的区域或体积,例如,复杂机械组件的内部。技术是一样的。建立边界范围[xlow,xhigh],[ylow,yhigh] ...并在此边界框内生成均匀分布的随机坐标。然后检查该随机位置是否在要采样的区域/体积内。如果没有,生成另一个随机元组并重新检查。