包含1的随机数函数python?

时间:2014-04-19 04:25:05

标签: python random

我是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值。

5 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

你可以用这样的东西吗?

random.randint(0, 1000) / 1000.0

或者更正式地说:

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

答案 2 :(得分:1)

试试这个:

import random
random.uniform(0.0, 1.0)

根据documentation [Python 3.x]:

  

返回一个随机浮点数 N a <= N <= ba <= bb <= N <= ab < a

请注意,上一段说明b实际上包含在函数返回的可能值范围内。但是,要注意第二部分(强调我的):

  

取决于等式a + (b-a) * random()中的浮点舍入,终点值b 可能包括也可能不包含

答案 3 :(得分: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]

生成随机数列表并将其除以最大值。结果列表仍然是均匀分布的。

答案 4 :(得分:0)

对于浮点数,您可以使用numpy的machine limits for floats类来获得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

这假设您正在为数字生成器使用全精度浮点数。有关详细信息,请阅读this Wikipedia article