目录
Generate N unique random numbers within a range in Python
- 在Python中生成一个范围内的N个唯一随机数
- 使用 random.shuffle() 在一个范围内生成 N 个唯一的随机数
- 使用 numpy 创建没有重复的随机数列表
- 在不包括某些数字的范围内生成随机数
在Python中生成一个范围内的N个唯一随机数
要在一个范围内生成 N 个唯一的随机数:
- 使用
range()
类创建range
对象。 - 使用该
random.sample()
方法获取 N 个唯一随机数的列表。 - 该
random.sample()
方法从提供的序列中返回一个包含 N 个唯一元素的列表。
import random def gen_random_numbers_in_range(low, high, n): return random.sample(range(low, high), n) # 👇️ [6, 9, 4, 8, 1] print(gen_random_numbers_in_range(1, 10, 5)) # 👇️ [8, 4, 1, 3, 5] print(gen_random_numbers_in_range(1, 10, 5))
我们使用range()
类来获取range
对象。
print(list(range(1, 5))) # 👉️ [1, 2, 3, 4] print(list(range(1, 8))) # 👉️ [1, 2, 3, 4, 5, 6, 7]
范围类通常用于循环特定次数。
该类range()
采用以下参数:
姓名 | 描述 |
---|---|
start |
表示范围开始的整数(默认为0 ) |
stop |
向上,但不包括提供的整数 |
step |
范围将由每 N 个数字组成,从start 到stop (默认为1 ) |
random.sample方法返回从提供的序列中选择的 N个
唯一元素的列表。
import random # 👇️ [5, 3, 8, 4, 7] print( random.sample( range(1, 10), 5 ) )
该random.sample()
方法返回从序列中选择的元素的 N 大小列表,无需替换。
如果样本大于序列,该random.sample()
方法将引发 a 。ValueError
import random # ⛔️ ValueError print( random.sample( range(1, 5), 5 ) )
如果您需要处理这种情况,请使用
try/except 块。
import random try: random_numbers = random.sample( range(1, 5), 5 ) except ValueError: # 👇️ this runs print('The sample is larger than the sequence')
试图检索比range
caused a
中存在的元素更多的元素ValueError
,然后由块处理except
。
或者,您可以使用该random.shuffle()
方法。
使用random.shuffle()生成一个范围内的N个唯一随机数
这是一个四步过程:
- 使用
range()
类来获取range
对象。 - 使用该类
list()
将range
对象转换为列表。 - 使用
random.shuffle()
方法对列表进行洗牌。 - 使用列表切片从列表中获取 N 个唯一的随机数。
import random def gen_random_numbers_in_range(low, high, n): a_list = list(range(low, high)) random.shuffle(a_list) return a_list[:n] # 👇️ [5, 7, 9, 3, 6] print(gen_random_numbers_in_range(1, 10, 5)) # 👇️ [9, 4, 6, 3, 8] print(gen_random_numbers_in_range(1, 10, 5))
random.shuffle
方法接受一个
序列并将其随机播放。
import random a_list = list(range(1, 10)) random.shuffle(a_list) print(a_list) # 👉️ [4, 7, 3, 9, 1, 2, 8, 6, 5]
最后一步是使用
列表切片从列表中选择 N 个唯一的随机元素。
列表切片的语法是my_list[start:stop:step]
.
索引start
是包含的,stop
索引是排他的(最多,但不包括)。
start
省略索引,则认为是,如果省略索引,则切片转到列表的末尾。 0
stop
Python 索引是从零开始的,因此列表中的第一项的索引为0
,最后一项的索引为-1
或len(my_list) - 1
。
切片list[:n]
返回n
打乱列表的第一个元素。
使用 NumPy 创建不重复的随机数列表
这是一个三步过程:
- 使用
range()
类创建range
对象。 - 使用该
numpy.random.choice()
方法创建一个没有重复的数字列表。 replace
将参数设置为False
以选择唯一数字。
import numpy as np list_of_numbers = np.random.choice( range(1, 15), 6, replace=False ).tolist() print(list_of_numbers) # 👉️ [13, 14, 9, 6, 11, 12]
确保安装
了 NumPy 模块以便能够运行代码示例。
pip install numpy # 👇️ or with pip3 pip3 install numpy
numpy.random.choice
方法从给定的
类数组对象生成随机样本。
replace
参数确定是否可以多次选择类数组对象的值。参数默认为. True
我们将replace
参数设置为False
,因此不会选择重复项。
如果需要将 NumPy 数组转换为原生 Python 列表,可以使用
tolist方法。
在不包括某些数字的范围内生成随机数
要生成一个范围内的随机数,不包括一些数字:
- 使用列表理解来迭代
range
对象。 - 使用
not in
运算符从列表中排除数字。 - 使用该
random.choice()
方法生成一个范围内的随机数。
from random import choice def gen_random_number(low, high, exclude): return choice( [number for number in range(low, high) if number not in exclude] ) numbers_to_exclude = [1, 3, 7] # 👇️ 2 print(gen_random_number(1, 10, numbers_to_exclude)) # 👇️ 19 print(gen_random_number(1, 100, numbers_to_exclude))
我们使用
列表理解来迭代一个range
对象。
范围类通常用于循环特定次数。
print(list(range(1, 5))) # 👉️ [1, 2, 3, 4] print(list(range(1, 3))) # 👉️ [1, 2]
在每次迭代中,我们使用not in
运算符从结果中排除数字列表。
from random import choice def gen_random_number(low, high, exclude): return choice( [number for number in range(low, high) if number not in exclude] )
in 运算符测试成员资格。例如,如果是 的成员
,则x in l
计算为,否则计算为。True
x
l
False
x not in l
返回 的否定x in l
。最后一步是使用该random.choice()
方法。
random.choice方法接受一个序列并从非空序列返回一个随机元素。
import random print(random.choice(['a', 'b'])) # 👉️ "a"
如果序列为空,则该方法引发一个IndexError
.
from random import choice def gen_random_number(low, high, exclude): return choice( [number for number in range(low, high) if number not in exclude] ) numbers_to_exclude = [1, 3, 7] result = [ gen_random_number(1, 10, numbers_to_exclude) for _ in range(3) ] print(result) # 👉️ [5, 2, 5]
We used a list comprehension to iterate over a range
object of length N and
called the get_random_number()
function on each iteration.
Alternatively, you can use set
objects.
# Generate random number in range excluding some numbers using a set
This is a four-step process:
- Get a
set
containing all numbers in the range. - Convert the list of numbers to exclude to a
set
object. - Get the difference between the
set
objects. - Use the
random.choice()
method to generate a random number in the range.
from random import choice def gen_random_number(low, high, exclude): return choice( list( set(number for number in range(low, high)) - set(exclude) ) ) numbers_to_exclude = [1, 3, 7] print(gen_random_number(1, 10, numbers_to_exclude)) # 👉️ 4 result = [ gen_random_number(1, 10, numbers_to_exclude) for _ in range(3) ] print(result) # 👉️ [5, 2, 5]
We used the set() class
to convert the range
object and the list of numbers to exclude to set
objects.
difference()
method.The minus sign is a shorthand for calling the difference()
method on the
set
.
print({1, 2, 3} - {2, 3}) # 👉️ {1}
The
difference()
method returns a new set
with elements in the set
that are not in the
provided iterable.
We used the list() class to convert the
set
object to a list and used the random.choice()
method to pick a random
number from the list.
# Additional Resources
You can learn more about the related topics by checking out the following
tutorials:
- Generate a random Float or List of random Floats in Python
- Generate a random alphanumeric String in Python
- Generate random Boolean (True or False) values in Python
- Generate random bytes of length N in Python
- Generate a random Hex string or Color in Python
- How to generate a random IP address in Python
- 如何在 Python 中生成随机单词或字母