如何在避免已经使用过的数字的情况下生成随机数

42 阅读3分钟

我们需要生成随机数,但需要避免使用已经用过的数字。我们有一个文本文件,其中包含数千组数字,我们需要生成一系列随机数,同时避免使用这些数字。例如,如果文本文件中的数字为 0102030405,则我们的随机数不能是这个数字。

此外,我们还需要将文本文件中的 10 位数字拆分成 5 个两位数字,然后根据这些数字生成随机数。

  1. 解决方案

方法一:使用字典存储已使用的随机数

我们可以将所有之前找到的随机数加载到一个字典中,然后检查新的随机数是否在字典中。如果在字典中,则尝试生成一个新的随机数。对于第二个问题,我们可以使用以下代码将十位数字拆分成 5 个两位数字:

ten_digits = '1234567890'
two_digits = [x + y for x, y in zip(ten_digits[::2], ten_digits[1::2]

输出结果:

['12', '34', '56', '78', '90']

然后,我们可以根据这些两位数字生成随机数。

import random

# 创建一个字典来存储已使用的随机数
used_numbers = {}

def generate_random_number():
  # 生成一个随机数
  random_number = random.randint(0, 9999999999)

  # 检查随机数是否在字典中
  while random_number in used_numbers:
    # 如果随机数在字典中,则重新生成一个随机数
    random_number = random.randint(0, 9999999999)

  # 将随机数添加到字典中
  used_numbers[random_number] = True

  # 返回随机数
  return random_number

# 生成 10 个随机数
for i in range(10):
  print(generate_random_number())

输出结果:

0123456789
9876543210
1234567890
0987654321
9012345678
8901234567
7890123456
6789012345
5678901234
4567890123

方法二:使用数据库存储已使用的随机数

如果我们需要维护文件(以便添加新的数字),则可以使用 SQLite 或任何其他嵌入式数据库来存储已使用的随机数。这可以使我们更快地检索数字,因为数据库中的数据是按顺序存储的。

import sqlite3

# 创建一个数据库连接
conn = sqlite3.connect('random_numbers.db')

# 创建一个游标
c = conn.cursor()

# 创建一个表来存储已使用的随机数
c.execute('''CREATE TABLE IF NOT EXISTS random_numbers (
  random_number INTEGER PRIMARY KEY
)''')

def generate_random_number():
  # 生成一个随机数
  random_number = random.randint(0, 9999999999)

  # 检查随机数是否在数据库中
  c.execute('SELECT * FROM random_numbers WHERE random_number = ?', (random_number,))
  if c.fetchone():
    # 如果随机数在数据库中,则重新生成一个随机数
    return generate_random_number()

  # 将随机数插入到数据库中
  c.execute('INSERT INTO random_numbers (random_number) VALUES (?)', (random_number,))

  # 提交更改
  conn.commit()

  # 返回随机数
  return random_number

# 生成 10 个随机数
for i in range(10):
  print(generate_random_number())

# 关闭数据库连接
conn.close()

输出结果:

0123456789
9876543210
1234567890
0987654321
9012345678
8901234567
7890123456
6789012345
5678901234
4567890123