首页 > 解决方案 > 生成重复数字的宾果卡

问题描述

n我创建了一个简单的 Bingo 卡片生成器,它可以在和之间生成 4 个数字n+15。然而,我注意到数字有时会生成两次,尽管if我写了一个应该找到重复项并重新运行该单元格的随机生成的语句。我的代码如下:

import random

ballCount = 75  # Max value of cell
gridWidth = 4
gridHeight = 5
numPerCard = 20  # Numbers generated per card
minimum = 1
maximum = 15


def generate_number(stored, small_num, big_num):
    random.seed(a=None, version=2)
    random_number = str(random.randint(small_num, big_num))
    if "| "+random_number+" |" in stored:
        generate_number(stored, small_num, big_num)
    return random_number


for row in range(gridHeight):
    string = ""
    for Number in range(gridWidth):
        number = generate_number(string, minimum, maximum)
        string += " | " + number
    string += " |"
    print(string)
    maximum += 15
    minimum += 15

这是一个带有重复输出的示例(23 出现 2 次):

 | 2 | 5 | 9 | 12 |
 | 25 | 23 | 19 | 23 |
 | 37 | 42 | 30 | 37 |
 | 60 | 49 | 50 | 55 |
 | 73 | 71 | 69 | 67 |

标签: python

解决方案


    if "| "+random_number+" |" in stored:
        generate_number(stored, small_num, big_num)
    return random_number

如果您已经拥有该号码,则generate_number再次拨打电话,但您仍会返回原始号码(副本)。

您可能有兴趣random.sample作为在某个范围内随机选择唯一数字的替代方法。例如:

>>> [random.sample(range(n, n+15), 4) for n in range(15, 75, 15)]
[[20, 26, 15, 23], [37, 44, 32, 40], [48, 45, 47, 50], [63, 62, 68, 71]]

或者,漂亮的印刷:

>>> for row in [random.sample(range(n, n+15), 4) for n in range(15, 75, 15)]:
...     print(f"| {' | '.join(map(str, row))} |")
...
| 17 | 15 | 27 | 22 |
| 34 | 33 | 42 | 36 |
| 54 | 51 | 55 | 48 |
| 68 | 73 | 61 | 72 |

推荐阅读