【问题标题】:How to make the randint function exclude numbers with repeated digits? [duplicate]如何使randint函数排除重复数字的数字? [复制]
【发布时间】:2021-10-16 05:31:57
【问题描述】:

如何使randint 函数不生成特定的数字列表?我必须创建一个随机银行卡代码生成器,而不是生成具有 4 个重复数字的数字,例如“1111”“2222”。

import random

bank_codes = int(input("Hur många koder ska genereras: "))
code = 0
unwanted_codes = [0000, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999]

while code < bank_codes:
    code += 1
    a = str(random.randint(1, 10000))

    if len(a) == 3:
        print('0' + a)

    elif len(a) == 2:
        print('00' + a)

    elif len(a) == 1:
        print('000' + a)

    else:
        print(a)

【问题讨论】:

  • 你应该看看secrets模块。
  • 你想多次选择同一个随机数吗?因为那肯定会发生。

标签: python python-3.x random


【解决方案1】:

如果生成 1 到 9998 范围内的随机数,则无需担心 0000 或 9999。使用这个,一个非常有效的命中或未命中方法是可能的:

from random import randint
unwanted_codes = set([1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888])

def rand_code():
    while True:
        code = randint(1,9998)
        if code not in unwanted_codes:
            return str(code).zfill(4)

zfill 方法用 0 填充左侧的字符串。

绝大多数情况下,一次通过循环就足够了。需要两次以上通过的情况很少见。

作为快速检查,len(set(rand_code() for _ in range(100000))) 的计算结果为 9990(很有可能——尽管有时也会看到 9989),这是有效代码的数量。

【讨论】:

    【解决方案2】:

    您可以使用random.randint 生成序列的长度,使用random.sample 生成序列本身。 random.sample 获取一个集合(有时称为“人口”),它会从中随机选择 k 不同的项目,给定长度 k。如果你给它一个集合,在这种情况下,每个数字都有三个唯一的实例,那么你可以保证在最终序列中同一个数字不会出现超过 3 次。

    from random import sample, randint
    from string import digits
    
    max_len = 4
    length = randint(1, max_len)
    
    population = digits * (max_len - 1)
    
    print("".join(sample(population, k=length)).zfill(max_len))
    

    【讨论】:

    • 我认为生成的分布不会是均匀的,这可能是个问题。
    【解决方案3】:

    这对你有用。

    import random
    bank_codes = int(input("Hur många koder ska genereras: "))
    code = 0
    unwanted_codes = [0000, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999]
    while code < bank_codes:
        code += 1
        a = (random.randint(1, 10000))
        if a not in unwanted_codes:
            print(a)
    

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 2021-01-28
      • 2018-04-24
      • 2014-09-11
      • 2023-01-16
      • 2015-10-31
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多