包含1的Python随机数函数?
我刚开始学习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 个回答
这是不是很简单:
list_rnd=[random.random() for i in range(_number_of_numbers_you_want)]
list_rnd=[item/max(list_rnd) for item in list_rnd]
生成一串随机数字,然后把这些数字除以它们中的最大值。这样得到的数字列表依然是均匀分布的。
试试这个:
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()
中的浮点数舍入。
考虑一下这个基于 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)
你觉得这样可以吗?
random.randint(0, 1000) / 1000.0
或者更正式一点:
precision = 3
randomNumber = random.randint(0, 10 ** precision) / float(10 ** precision)