我们需要生成随机数,但需要避免使用已经用过的数字。我们有一个文本文件,其中包含数千组数字,我们需要生成一系列随机数,同时避免使用这些数字。例如,如果文本文件中的数字为 0102030405,则我们的随机数不能是这个数字。
此外,我们还需要将文本文件中的 10 位数字拆分成 5 个两位数字,然后根据这些数字生成随机数。
- 解决方案
方法一:使用字典存储已使用的随机数
我们可以将所有之前找到的随机数加载到一个字典中,然后检查新的随机数是否在字典中。如果在字典中,则尝试生成一个新的随机数。对于第二个问题,我们可以使用以下代码将十位数字拆分成 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