生成0到9之间的随机整数

1869

如何在Python中生成介于0和9(含)之间的随机整数?

例如,0123456789


这段程序相关的内容是:如何在Python中创建一个加密安全的随机数。以下是代码示例:>>> from random import SystemRandom >>> cryptogen = SystemRandom() >>> [cryptogen.randrange(3) for i in range(20)]请注意,以上代码仅供参考,不应用于生产环境。 - Charlie Parker
1
这段代码是有效的:import random; print(random.randint(0, 9)) - Charlie Parker
23个回答

2576

尝试使用random.randrange函数:

from random import randrange
print(randrange(10))

160
注意,这些是伪随机数,它们不具备密码学安全性。在任何情况下都不要使用它们,以免攻击者猜测你的数字。请使用 secrets 模块获取更安全的随机数。参考文献:https://docs.python.org/zh-cn/3/library/random.html - user6269864
2
特别是在随机模块中,应该优先使用secrets而不是默认的伪随机数生成器,因为后者是为建模和仿真而设计的,而不是用于安全或密码学。 - florian.isopp
13
为了避免任何人都必须导航到secrets模块来完成此操作: import secrets secrets.randbelow(10) - sazerac
3
请注意,secrets模块是在Python 3.6版本中首次添加的。 - user3540325
1
在 Python 3.6 之前,一个近似的方法是创建 random.SystemRandom() 的实例并调用该实例的方法;random.SystemRandom()secrets(我相信它是基于它实现的)都依赖于操作系统提供的加密随机性(例如,在 Windows 上使用 CryptGenRandom,在类 UNIX 系统上使用 /dev/urandom)。 - ShadowRanger

782
尝试使用 random.randint
import random
print(random.randint(0, 9))

文档说明:

random.randint(a, b)

Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).


8
关于3.8,它仍然“返回一个随机整数N,满足a <= N <= b。是randrange(a, b+1)的别名。” @Yly - Denis

187

试试这个:

from random import randrange, uniform

# randrange gives you an integral value
irand = randrange(0, 10)

# uniform gives you a floating-point value
frand = uniform(0, 10)

104
from random import randint

x = [randint(0, 9) for p in range(0, 10)]

这将生成10个在0到9范围内(包括0和9)的伪随机整数。


我想在2,500行(row_count)的试运行中仅使用10行(RANDOM_LIMIT),因此我根据这个答案使用了random_row_nos = [randint(1, row_count) for p in range(0, RANDOM_LIMIT)],第一次就成功了! - WinEunuuchs2Unix

91

secrets 模块是 Python 3.6 中的新模块。在密码学或安全方面使用比 random 模块更好。

要随机打印一个0-9(包括0和9)之间的整数:

from secrets import randbelow
print(randbelow(10))

详细信息请参见PEP 506

请注意,这实际上取决于使用情况。使用random模块可以设置随机种子,有助于生成伪随机但可重复的结果,而secrets模块则不可能。

random模块还更快(在Python 3.9上进行了测试):

>>> timeit.timeit("random.randrange(10)", setup="import random")
0.4920286529999771
>>> timeit.timeit("secrets.randbelow(10)", setup="import secrets")
2.0670733770000425

3
这将改进答案并应该被添加。如果有更多注重安全的答案可用,应始终添加。 - SudoKid
假设 secretsrandom 慢得多,这合理吗?一定有什么缺点。 - Mark Ransom
@MarkRansom 请查看编辑 - Chris_Rands

75

我会尝试以下其中一个:

1.> numpy.random.randint

import numpy as np
X1 = np.random.randint(low=0, high=10, size=(15,))

print (X1)
>>> array([3, 0, 9, 0, 5, 7, 6, 9, 6, 7, 9, 6, 6, 9, 8])

2.> numpy.random.uniform

import numpy as np
X2 = np.random.uniform(low=0, high=10, size=(15,)).astype(int)

print (X2)
>>> array([8, 3, 6, 9, 1, 0, 3, 6, 3, 3, 1, 2, 4, 0, 4])

3.> numpy.random.choice

import numpy as np
X3 = np.random.choice(a=10, size=15 )

print (X3)
>>> array([1, 4, 0, 2, 5, 2, 7, 5, 0, 0, 8, 4, 4, 0, 9])

4.> random.randrange

from random import randrange
X4 = [randrange(10) for i in range(15)]

print (X4)
>>> [2, 1, 4, 1, 2, 8, 8, 6, 4, 1, 0, 5, 8, 3, 5]

5.> random.randint

from random import randint
X5 = [randint(0, 9) for i in range(0, 15)]

print (X5)
>>> [6, 2, 6, 9, 5, 3, 2, 3, 3, 4, 4, 7, 4, 9, 6]

速度:

np.random.uniform和 np.random.randintnp.random.choice, random.randrange, random.randint 快得多(快约10倍)。

%timeit np.random.randint(low=0, high=10, size=(15,))
>> 1.64 µs ± 7.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit np.random.uniform(low=0, high=10, size=(15,)).astype(int)
>> 2.15 µs ± 38.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit np.random.choice(a=10, size=15 )
>> 21 µs ± 629 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit [randrange(10) for i in range(15)]
>> 12.9 µs ± 60.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit [randint(0, 9) for i in range(0, 15)]
>> 20 µs ± 386 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

注意:

1.> np.random.randint 生成一个半开区间 [low, high) 内的随机整数。

2.> np.random.uniform 生成一个半开区间 [low, high) 内均匀分布的随机数。

3.> np.random.choice 以 np.arange(n) 的形式生成一个半开区间 [low, high) 内的随机样本。

4.> random.randrange(stop) 从区间 start 到 stop(不包括 stop)中随机选择一个数。

5.> random.randint(a, b) 返回一个满足 a <= N <= b 的随机整数 N。

6.> astype(int) 将 numpy 数组转换为整型数据类型。

7.> 我已选择 size = (15,),这将给您一个长度为 15 的 numpy 数组。


1
ModuleNotFoundError: 找不到名为 'numpy' 的模块 - SL5net
1
如果出现了那个错误,你是否已经安装了numpy (pip install numpy)并且使用import numpy as np导入了它? - Unterbelichtet
随机数是一个内置模块,为什么要通过numpy导入它?是因为numpy扩展了它吗? - LightCC
@LightCC 我认为因为它是使用C语言和高度优化的,所以生成多个随机数会更快。尽管获取单个数字可能会更快,因为没有那么多的开销(试一下,但不要在微小的优化上疯狂)。 - Eric Jin

36

选择数组的大小(在本例中,我选择的大小为20)。然后使用以下代码:

import numpy as np   
np.random.randint(10, size=(1, 20))

您可以期望看到以下形式的输出(每次运行时将返回不同的随机整数;因此,您可以预期输出数组中的整数与以下示例不同)。

array([[1, 6, 1, 2, 8, 6, 3, 3, 2, 5, 6, 5, 0, 9, 5, 6, 4, 5, 9, 3]])

3
了解Numpy如何生成指定大小的随机数组也是很有用的,而不仅仅是一个单独的随机数。 (文档:numpy.random.randint - jkdev

32

虽然许多文章展示了如何获取一个随机整数,但是原始问题要求生成随机整数(复数):

如何在 Python 中生成介于 0 到 9(包括 0 和 9)之间的随机整数?

为了清晰起见,在这里我们演示如何获得多个随机整数。

假定

>>> import random


lo = 0
hi = 10
size = 5

代码

多个随机整数

# A
>>> [lo + int(random.random() * (hi - lo)) for _ in range(size)]
[5, 6, 1, 3, 0]

# B
>>> [random.randint(lo, hi) for _ in range(size)]
[9, 7, 0, 7, 3]

# C
>>> [random.randrange(lo, hi) for _ in range(size)]
[8, 3, 6, 8, 7]

# D
>>> lst = list(range(lo, hi))
>>> random.shuffle(lst)
>>> [lst[i] for i in range(size)]
[6, 8, 2, 5, 1]

# E
>>> [random.choice(range(lo, hi)) for _ in range(size)]
[2, 1, 6, 9, 5]

随机整数示例

# F
>>> random.choices(range(lo, hi), k=size)
[3, 2, 0, 8, 2]

# G
>>> random.sample(range(lo, hi), k=size)
[4, 5, 1, 2, 3]

详情

有些帖子展示了如何本地生成多个随机整数。1以下是一些解决暗示问题的选项:

  • A: random.random 返回一个在区间 [0.0, 1.0) 内的随机浮点数
  • B: random.randint 返回一个在区间 a <= N <= b 内的随机整数 N
  • C: random.randrangerandint(a, b+1) 的别名
  • D: random.shuffle 对一个序列进行原地打乱
  • E: random.choice 从非空序列中返回一个随机元素
  • F: random.choices 返回一个从总体(有放回)选取 k 个样本的列表,适用于 Python 3.6+
  • G: random.sample 返回一个从总体(无放回)选取 k 个不重复样本的列表:2

请参阅R. Hettinger有关使用random模块示例进行分块和别名处理的talk

下面是标准库和Numpy中一些随机函数的比较:

| | random                | numpy.random                     |
|-|-----------------------|----------------------------------|
|A| random()              | random()                         |
|B| randint(low, high)    | randint(low, high)               |
|C| randrange(low, high)  | randint(low, high)               |
|D| shuffle(seq)          | shuffle(seq)                     |
|E| choice(seq)           | choice(seq)                      |
|F| choices(seq, k)       | choice(seq, size)                |
|G| sample(seq, k)        | choice(seq, size, replace=False) |

你可以快速将Numpy中的许多distributions之一转换为随机整数样本。3

示例

>>> np.random.normal(loc=5, scale=10, size=size).astype(int)
array([17, 10,  3,  1, 16])

>>> np.random.poisson(lam=1, size=size).astype(int)
array([1, 3, 0, 2, 0])

>>> np.random.lognormal(mean=0.0, sigma=1.0, size=size).astype(int)
array([1, 3, 1, 5, 1])

1即@John Lawrence Aspden,@S T Mohammed,@SiddTheKid,@user14372,@zangw等人。 2@prashanth提到了这个模块显示一个整数。 3@Siddharth Satpathy演示了这个模块。


30
你需要使用Python标准库中的random模块。 使用以下代码...
from random import randint

num1= randint(0,9)

这将把变量num1设置为介于09之间的随机数(包括09)。


1
你也可以选择 randrange(10) - SamTheProgrammer

26

通过random.shuffle尝试这个。

>>> import random
>>> nums = range(10)
>>> random.shuffle(nums)
>>> nums
[6, 3, 5, 4, 0, 1, 2, 9, 8, 7]

3
这不是正确的答案,应该被删除。 - Nicolas Gervais
@NicolasGervais 这可能不是原问题的正确答案,但它仍然是一个有用的答案,因此它应该留在原地。 - Dan Niero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接