Python 随机模块:如何生成包含特定数字的随机数?

Python random module: How can I generate a random number which includes certain digits?

我正在尝试在 Python 中生成一个随机数,但我需要它包含某些数字。

假设我想要的范围在 100000 到 999999 之间,所以我希望它在 那个范围 内,但也包括 1、4 和 5 等数字。

有办法吗?

对我来说显而易见的答案是蛮力。

import random

def check(digits,number):
    passes = True
    number = str(number)
    for k in digits:
        if not str(k) in number:
            passes = False
            break
    return passes

def genRandom(digits):
    minimum = 100000
    maximum = 1000000
    r = minimum+int(random.random()*(maximum-minimum))
    while not check(digits,r):
        r = minimum + int(random.random() * (maximum - minimum))
    return r

print(genRandom([1,4,5]))

通过阅读评论,我看到了另外 3 条可靠的建议。首先用需要的值随机替换数字。这听起来很简单,但需要一些丑陋的东西来避免替换您指定为必要的数字,并避免在可能让数字超过您的号码末尾时出现索引错误。

import random

def genRandom(digits):
    digits = [str(k) for k in digits]
    minimum = 100000
    maximum = 1000000
    r = str(minimum+int(random.random()*(maximum-minimum)))
    for k in digits:
        while not k in r:
            i = int(random.random()*len(r))
            if r[i] in digits:
                if i==len(r)-1:
                    if not r[i] in r[0:i]:
                        continue
                elif not r[i] in r[0:i]+r[i+1:]:
                    continue
            if i==len(r)-1:
                r=r[0:i]+k
            else:
                r=r[0:i]+k+r[i+1:]
    return(r)

print(genRandom([1,4,5]))

enke 在他们的回答中很好地说明了生成可接受数字列表并从中选择的第三个选项。虽然这是一个看起来不错的答案,但实际上在单个调用的运行时间方面要密集得多。

我认为最好的答案是科波菲尔逐位构建数字。

您可以逐位构建数字

>>> import random
>>> def fun(required=(),size=6):
        result = list(required)
        n = size-len(result)
        result.extend( random.randint(0,10) for _ in range(n)) # fill in the remaining digits
        random.shuffle(result) 
        assert any(result) #make sure that there is at least one non zero digit
        while not result[0]: #make sure that the first digit is non zero so the resulting number be of the required size
            random.shuffle(result)
        return int("".join(map(str,result)))

>>> fun([1,4,5])
471505
>>> fun([1,4,5])
457310
>>> fun([1,4,5])
912457
>>> fun([1,4,5])
542961
>>> fun([1,4,5])
145079
>>> 

我能想到的最简单的方法是在范围的开头或结尾添加一些额外的数字,然后将这些额外的数字映射到您想要的数字。使用您的 145 示例,此示例说明了它是如何工作的。

import random

num = random.randint(99997, 999999)
if num == 99997:
  num = 1
elif num == 99998:
  num = 4
elif num == 99999:
  num = 5
print(num)