在 Python 中生成一个范围内的 N 个唯一随机数

目录

Generate N unique random numbers within a range in Python

  1. 在Python中生成一个范围内的N个唯一随机数
  2. 使用 random.shuffle() 在一个范围内生成 N 个唯一的随机数
  3. 使用 numpy 创建没有重复的随机数列表
  4. 在不包括某些数字的范围内生成随机数

在Python中生成一个范围内的N个唯一随机数

要在一个范围内生成 N 个唯一的随机数:

  1. 使用range()类创建range对象。
  2. 使用该random.sample()方法获取 N 个唯一随机数的列表。
  3. 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 个数字组成,从startstop(默认为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')

试图检索比rangecaused a
中存在的元素更多的元素
ValueError,然后由块处理except

或者,您可以使用该random.shuffle()方法。

使用random.shuffle()生成一个范围内的N个唯一随机数

这是一个四步过程:

  1. 使用range()类来获取range对象。
  2. 使用该类list()range对象转换为列表。
  3. 使用random.shuffle()方法对列表进行洗牌。
  4. 使用列表切片从列表中获取 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省略索引,则认为是,如果省略索引,则切片转到列表的末尾。 0stop

Python 索引是从零开始的,因此列表中的第一项的索引为0,最后一项的索引为-1len(my_list) - 1

切片list[:n]返回n打乱列表的第一个元素。

使用 NumPy 创建不重复的随机数列表

这是一个三步过程:

  1. 使用range()类创建range对象。
  2. 使用该numpy.random.choice()方法创建一个没有重复的数字列表。
  3. 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方法。

在不包括某些数字的范围内生成随机数

要生成一个范围内的随机数,不包括一些数字:

  1. 使用列表理解来迭代range对象。
  2. 使用not in运算符从列表中排除数字。
  3. 使用该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计算为,否则计算为TruexlFalse

x not in l返回 的否定x in l

最后一步是使用该random.choice()方法。

random.choice方法接受一个序列并非空序列返回一个随机元素。

主程序
import random print(random.choice(['a', 'b'])) # 👉️ "a"

如果序列为空,则该方法引发一个IndexError.

如果您需要在一个范围内生成 N 个随机数,不包括数字列表,请使用列表理解。
主程序
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:

  1. Get a set containing all numbers in the range.
  2. Convert the list of numbers to exclude to a set object.
  3. Get the difference between the set objects.
  4. Use the random.choice() method to generate a random number in the range.
main.py
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.

Set objects are an unordered collection of unique elements and implement a difference() method.

The minus sign is a shorthand for calling the difference() method on the
set.

main.py
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: