包含1的Python随机数函数?

9 投票
7 回答
7898 浏览
提问于 2025-04-18 03:21

我刚开始学习Python,正在为一个项目写程序。首先,我需要生成一个在0到1.0之间的点,包括0和1.0,也就是这个范围:[0, 1.0]。我在Python的库里查找函数(https://docs.python.org/2/library/random.html),找到了一个函数:

random.random()

这个函数会返回一个在[0.0, 1.0)范围内的随机浮点数。这里有个问题,因为它不包括1。虽然实际上生成1的概率非常小,但因为这是一个科学程序,会用于更大的数据收集,所以这点很重要。

我还找到了另一个函数:

rand.randint

这个函数会返回一个整数,这也是个问题。

我在网站上做了一些研究,还查看了之前的问题,发现这个函数:

random.uniform(a, b)

只会返回一个大于或等于a且小于b的数字。

有没有人知道如何在Python中创建一个包含[0, 1.0]的随机函数呢?

如果我有任何错误的信息,请纠正我。谢谢。

*这些随机数代表了三维空间中一个球体上的x值。

7 个回答

0

这是不是很简单:

list_rnd=[random.random() for i in range(_number_of_numbers_you_want)]
list_rnd=[item/max(list_rnd) for item in list_rnd]

生成一串随机数字,然后把这些数字除以它们中的最大值。这样得到的数字列表依然是均匀分布的。

1

对于浮点数,你可以使用numpy的浮点数的机器极限类来获取64位或32位浮点数的最小值。理论上,你可以把这个最小值加到random.uniform(a, b)中的b上,这样生成器就能包含1这个数:

import numpy
import random

def randomDoublePrecision():
    floatinfo = numpy.finfo(float)
    epsilon = floatinfo.eps
    a = random.uniform(0, 1 + eps)
    return a

这假设你在使用全精度的浮点数作为你的数字生成器。如果想了解更多,可以看看这篇维基百科文章

3

试试这个:

import random
random.uniform(0.0, 1.0)

根据文档 [Python 3.x],这个函数会:

返回一个随机的浮点数 N,这个数会在 a <= N <= b 的范围内,如果 a <= b;如果 b < a,那么 b <= N <= a

注意,上面这段话提到 b 实际上是会被包含在函数返回的可能值范围内的。不过,要小心第二部分(我强调的):

结束值 b 可能会被包含,也可能不会被包含,这取决于在公式 a + (b-a) * random() 中的浮点数舍入。

4

考虑一下这个基于 random.uniform 函数构建的功能。我认为重新抽样的方法应该让所有在目标区间内的数字出现的概率是一样的,因为返回 candidate > b 的概率是 0,而且最开始所有数字出现的概率应该是相等的。

import sys
import random


def myRandom(a, b):
    candidate = uniform.random(a, b + sys.float_info.epsilon)
    while candidate > b:
       candidate = uniform.random(a, b + sys.float_info.epsilon)
    return candidate

正如 gnibbler 在下面提到的,对于一般情况,可能更合理的是将两个调用都改成下面的方式。请注意,这样做只有在 b > 0 的情况下才会正确工作。

 candidate = uniform.random(a, b*1.000001)
7

你觉得这样可以吗?

random.randint(0, 1000) / 1000.0

或者更正式一点:

precision = 3
randomNumber = random.randint(0, 10 ** precision) / float(10 ** precision)

撰写回答