在Python中生成随机小数和整数,包括random()、randrange()和randint()。

商业

可以使用Python标准库的随机模块中的随机()、统一()、randange()和randint()函数来生成随机数。

随机模块包含在标准库中,所以不需要额外安装。当然,你需要导入它。

这里提供了以下信息。

  • random.random()(0.0和1.0之间的浮点数)
  • random.uniform()(任何范围的浮点数)
  • 产生遵循正态分布、高斯分布等的随机数。
  • random.randrange()(任意范围和步长的整数)
  • random.randint()(任何范围内的一个整数)
  • 生成一个以随机数为元素的列表
    • 随机浮点数的列表
    • 整数随机数列表
  • 初始化随机数发生器(固定随机数种子)。

关于如何随机提取或排序一个列表中的元素,请参见下面的文章。

random.random() (0.0和1.0之间的浮点数)

随机模块的函数random()生成一个0.0到1.0之间的float类型的随机浮点数。

import random

print(random.random())
# 0.4496839011176701

random.uniform() (任何范围的浮点数)

uniform(a, b)这个随机模块的函数在以下任何范围内生成浮点数浮动类型的随机数

  • a <= n <= b
  • b <= n <= a
import random

print(random.uniform(100, 200))
# 175.26585048238275

两个参数可以是大的,也可以是小的;如果它们是相等的,自然只返回这个值。返回值总是一个浮点数。

print(random.uniform(100, -100))
# -27.82338731501028

print(random.uniform(100, 100))
# 100.0

参数也可以指定为一个浮点数。

print(random.uniform(1.234, 5.637))
# 2.606743596829249

b的值是否包括在范围内,取决于以下四舍五入,如有记载。
a + (b-a) * random.random()

端点值b是否在范围内,取决于下式中的浮点舍入情况
a + (b-a) * random()
random.uniform() — Generate pseudo-random numbers — Python 3.10.2 Documentation

产生遵循正态分布、高斯分布等的随机数。

上面的random()和uniform()函数可以生成均匀分布的随机数,但也有一些函数可以生成遵循以下分布的浮点数。

  • β分布:random.betavariate()
  • 指数分布:random.expovariate()
  • 伽马分布:random.gammavariate()
  • 高斯分布:random.gauss()
  • 对数正态分布:random.lognormvariate()
  • 正态分布:random.normalvariate()
  • Von Mises分布:random.vonmisesvariate()
  • 帕累托分布:random.paretovariate()
  • 魏布尔分布:random.weibullvariate()

每个分布的参数是由参数指定的。详情见官方文档。

random.randrange() (任意范围和步长的整数)

randrange(start, stop, step)
这个随机模块的函数返回一个从以下元素中随机选择的元素。
range(start, stop, step)

与range()一样,参数start和step可以被省略。如果省略它们,start=0,step=1。

import random

print(list(range(10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(random.randrange(10))
# 5

参数step可以被设置为生成一个偶数或奇数的随机整数,或者一个3的倍数的随机整数。

例如,如果start是偶数,step=2,则只能随机获得范围内的偶数整数。

print(list(range(10, 20, 2)))
# [10, 12, 14, 16, 18]

print(random.randrange(10, 20, 2))
# 18

random.randint() (任何范围内的一个整数)

randint(a, b)
这个随机模块的函数返回以下随机整数int。
a <= n <= b
randrange(a, b + 1)相当于这个;注意,b的值也包括在范围内。

print(random.randint(50, 100))
# print(random.randrange(50, 101))
# 74

生成一个以随机数为元素的列表

在本节中,我们将解释如何使用标准库的随机模块来生成一个以随机数为元素的列表。

带有浮点的随机数列表

要生成一个元素为浮点随机数的列表,请将random()和uniform()函数与列表理解符号相结合。

import random

print([random.random() for i in range(5)])
# [0.5518201298350598, 0.3476911314933616, 0.8463426180468342, 0.8949046353303931, 0.40822657702632625]

在上面的例子中,使用了range(),但是对于所需的元素数量,列表和图元也是可行的。关于列表理解的更多细节,请参考下面的文章。

整数int随机数的列表

当生成一个元素为整数的列表时,将上面的randange()和randint()与列表理解符号相结合,可能会导致重复的值。

print([random.randint(0, 10) for i in range(5)])
# [8, 5, 7, 10, 7]

如果你想做一个没有重复的随机整数序列,可以用random.sample()在任意范围内提取range()的元素。

print(random.sample(range(10), k=5))
# [6, 4, 3, 7, 5]

print(random.sample(range(100, 200, 10), k=5))
# [130, 190, 140, 150, 170]

关于random.sample()的更多信息,请参考以下文章。

初始化随机数发生器(固定随机数种子)。

通过给随机模块的函数seed()提供一个任意的整数,可以固定随机数种子并初始化随机数发生器。

在用相同的种子进行初始化后,随机值总是以相同的方式产生。

random.seed(0)
print(random.random())
# 0.8444218515250481

print(random.random())
# 0.7579544029403025

random.seed(0)
print(random.random())
# 0.8444218515250481

print(random.random())
# 0.7579544029403025