生成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个回答

0

对于Python 3.6,我运气更好。

str_Key = ""                                                                                                
str_RandomKey = ""                                                                                          
for int_I in range(128):                                                                                    
      str_Key = random.choice('0123456789')
      str_RandomKey = str_RandomKey + str_Key 

只需添加字符如'ABCD'和'abcd'或'^!~=-><'以更改要提取的字符池,更改范围以更改生成的字符数。


小问题:str_RandomKey不是原帖所要求的整数类型。 - Jürgen Schwietering

0
使用numpy生成0到9之间的随机整数
使用numpy的方法:
如果您可以接受依赖numpy,那么自从1.17版本以来,numpy有了生成器(Generators),它们比randint/choice等方法要快得多,如果您想生成大量的随机整数(例如超过10000个整数)。要构建它,请使用np.random.default_rng()。然后调用integers()或choice()来生成随机整数。与标准库相比,如果您想生成一个大型的随机数列表(例如生成100万个随机整数),numpy生成器的速度要快得多,大约比numpy的randint快3倍,比stdlib的random快40倍。
例如,要生成100万个0到9之间的整数,可以使用以下任一方法。
import numpy as np
# option 1
numbers = np.random.default_rng().integers(0, 10, size=1000000)
# option 2
numbers = np.random.default_rng().choice(10, size=1000000)

默认情况下,它使用PCG64生成器;然而,如果您想使用标准库中的Mersenne Twister生成器,可以将其实例作为种子序列传递给default_rng(),如下所示。
rng = np.random.default_rng(np.random.MT19937())
numbers = rng.integers(0, 10, size=1000)

使用random

如果您只能使用标准库,并且想要生成大量的随机整数,那么random.choices()random.randint()random.randrange()要快得多。2 例如,要生成100万个介于0和9之间的随机整数:

import random
numbers = random.choices(range(10), k=1000000)

一些计时结果
在Python 3.12和numpy 1.26上进行了测试。
import timeit
import random
import numpy as np

def numpy_randint():
    return np.random.randint(0, 10, size=1000000)

def numpy_Gen_integers():
    return np.random.default_rng().integers(0, 10, size=1000000)

def numpy_Gen_choice():
    return np.random.default_rng().choice(10, size=1000000)

def random_randrange():
    return [random.randrange(10) for _ in range(1000000)]

def random_choices():
    return random.choices(range(10), k=1000000)


t1 = min(timeit.repeat(numpy_randint, number=100))      # 1.9559144999366254
t2 = min(timeit.repeat(numpy_Gen_integers, number=100)) # 0.6704635999631137
t3 = min(timeit.repeat(numpy_Gen_choice, number=100))   # 0.6696784000378102
t4 = min(timeit.repeat(random_randrange, number=100))   # 64.98768060002476
t5 = min(timeit.repeat(random_choices, number=100))     # 25.686857299879193

2 如果我们看一下它们的源代码实现,random.randrange()(以及random.randint(),因为它是前者的语法糖)使用一个while循环来生成伪随机数,通过_randbelow方法,而random.choices()则调用random()一次,并使用它来索引种群。因此,如果需要生成大量的伪随机数,这个while循环的成本会累积起来。


0
OpenTURNS 不仅允许模拟随机整数,还可以使用 UserDefined 定义类定义相关分布。

以下模拟了 12 个分布结果。

import openturns as ot
points = [[i] for i in range(10)]
distribution = ot.UserDefined(points) # By default, with equal weights.
for i in range(12):
    x = distribution.getRealization()
    print(i,x)

这将打印:

0 [8]
1 [7]
2 [4]
3 [7]
4 [3]
5 [3]
6 [2]
7 [9]
8 [0]
9 [5]
10 [9]
11 [6]

括号存在是因为x是1维中的一个Point。 通过单次调用getSample生成12个结果会更容易:
sample = distribution.getSample(12)

将会生成:

>>> print(sample)
     [ v0 ]
 0 : [ 3  ]
 1 : [ 9  ]
 2 : [ 6  ]
 3 : [ 3  ]
 4 : [ 2  ]
 5 : [ 6  ]
 6 : [ 9  ]
 7 : [ 5  ]
 8 : [ 9  ]
 9 : [ 5  ]
10 : [ 3  ]
11 : [ 2  ]

关于这个主题的更多细节在这里:http://openturns.github.io/openturns/master/user_manual/_generated/openturns.UserDefined.html


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