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


1335

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

例如,0123456789


15
0-9的“随机”代上的漂亮样式点
ColinMac

Answers:




134

尝试这个:

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)

81
from random import randint

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

这将生成10个伪随机整数,范围在0到9之间(含0和9)。


63

secrets模块是Python 3.6中的新增功能。这比random用于加密或安全用途的模块更好。

要随机打印范围为0-9的整数:

from secrets import randbelow
print(randbelow(10))

有关详细信息,请参阅PEP 506


3
这将改善答案,应予以补充。如果可能的话,应该始终添加更加注重安全性的答案。
SudoKid

30

选择数组的大小(在此示例中,我选择的大小为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]])

2
了解Numpy如何生成指定大小的随机数组(而不仅仅是单个随机数)也很有帮助。(文档:numpy.random.randint
jkdev

28

尝试通过 random.shuffle

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

这不是正确答案,应将其删除。
Nicolas Gervais,

21

我会尝试以下之一:

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.> random.randrange

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

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

4.> random.randint

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

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

速度:

np.random.randint最快的,其次是np.random.uniformrandom.randrangerandom.randint最慢的

►两者np.random.randintnp.random.uniform快得多(〜8 - 12倍的速度)比random.randrange和random.randint

%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 [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.> random.randrange(停止)从range(开始,停止,步进)生成一个随机数。

4.> random.randint(a,b)返回一个随机整数N,使得a <= N <= b。

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

6.>我选择尺寸=(15,)。这将为您提供一个长度为15的numpy数组。


18

如果是连续数字randintrandrange可能是最佳选择,但是如果序列中有多个不同的值(即a list),则也可以使用choice

>>> import random
>>> values = list(range(10))
>>> random.choice(values)
5

choice 也适用于非连续样本中的一项:

>>> values = [1, 2, 3, 5, 7, 10]
>>> random.choice(values)
7

如果您需要“密码学上很强大”,则secrets.choice在python 3.6及更高版本中也有:

>>> import secrets
>>> values = list(range(10))
>>> secrets.choice(values)
2

如果我们要从序列中获取更多数字怎么办?
Gunjan naik

如果应该不更换:random.sample。进行替换时,您可以使用choice:,例如包含3个随机值的列表进行替换:[choice(values) for _ in range(3)]
MSeifert

18

虽然许多文章都演示了如何获取一个随机整数,但最初的问题是询问如何生成随机整数s(复数):

如何在Python中生成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 以下是一些解决隐含问题的选项:

另请参阅R.Hettinger 关于“块和别名” 的演讲,并使用以下示例random模块中的。

这是标准库和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中的许多分布之一快速转换为随机整数样本。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,@ ST Mohammed,@ SiddTheKid,@ user14372,@ zangw等。 2 @prashanth提到此模块显示一个整数。 3由@Siddharth Satpathy演示


14

如果要使用numpy,请使用以下命令:

import numpy as np
print(np.random.randint(0,10))

1
您可以讲一些有关“ numpy”的信息。
西蒙

11
是的 感谢您的链接。但是我的意思是,您可以通过在引用两行代码之前提供详细信息来改善答案。例如出于某种原因,某人更愿意使用它而不是已经内置的东西。
西蒙

9
>>> import random
>>> random.randrange(10)
3
>>> random.randrange(10)
1

要获取十个样本的列表:

>>> [random.randrange(10) for x in range(10)]
[9, 0, 4, 0, 5, 7, 4, 3, 6, 8]


6

random.sample 是另一个可以使用的

import random
n = 1 # specify the no. of numbers
num = random.sample(range(10),  n)
num[0] # is the required number

6

最好的方法是使用导入随机函数

import random
print(random.sample(range(10), 10))

或没有任何库导入:

n={} 
for i in range(10):
    n[i]=i

for p in range(10):
    print(n.popitem()[1])

这里的popitems从字典中删除并返回一个任意值n


3

这更多是一种数学方法,但100%的时间有效:

假设您要使用random.random()函数生成介于a和之间的数字b。为此,只需执行以下操作:

num = (b-a)*random.random() + a;

当然,您可以生成更多数字。


2

随机模块的文档页面:

警告:出于安全目的,不应使用此模块的伪随机数生成器。如果需要加密安全的伪随机数生成器,请使用os.urandom()或SystemRandom。

Python 2.4中引入的random.SystemRandom被认为是加密安全的。在编写本文时,它在Python 3.7.1中仍然可用。

>>> import string
>>> string.digits
'0123456789'
>>> import random
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'1'
>>> random.SystemRandom().choice(string.digits)
'8'
>>> random.SystemRandom().choice(string.digits)
'5'

代替string.digitsrange可以与理解一起用于其他一些答案。根据您的需要混合搭配。


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是因为它是一Point维的。只需调用以下命令即可产生12个结果getSample

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/_genic/openturns.UserDefined.html


-1

我对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”或“ ^!〜=-> <”之类的字符即可更改要提取的字符池,更改范围以更改生成的字符数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.