【问题标题】:Python random module: How can I generate a random number which includes certain digits?Python 随机模块:如何生成包含某些数字的随机数?
【发布时间】:2022-01-11 01:41:06
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

  • 生成一个随机数。如果它没有数字 4,则随机将其中一个数字替换为 4。对所有需要的数字重复此操作。或者只是继续生成随机数,直到获得满足所有条件的随机数。
  • 我会说这是不可能的。或者它可能是可能的,但是你的号码不会是随机的,所以它会打败随机性。您将严格限制可能数字的数量。最好的解决方案是预先确定您可接受的数字列表并随机选择一个,或者生成随机数,检查它是否符合您的要求,如果不符合,请重试并循环直到可接受。
  • 您好,欢迎来到 StackOverflow!澄清一下,您是否希望将1、4 或5 作为数字包含在随机生成的数字中(例如130929、230984 或500000),或者您是要求将数字 1、4 和 5 包含在请求随机数时可能生成的数字池中?
  • @NathanAnsel 嗨,谢谢。我在问如何使 1、4 和 5 作为数字包含在随机生成的数字中。

标签: python random numbers


【解决方案1】:

您可以逐位构建数字

>>> 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
>>> 

【讨论】:

  • 最佳答案 +1。
【解决方案2】:

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

import random

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

【讨论】:

  • 我不确定你是否理解了这个问题。
  • @kpie 请问您如何找到我的捷径? #JdevSeer
【解决方案3】:

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

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]))

通过阅读 cmets,我看到了其他 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 在他们的回答中很好地说明了生成可接受数字列表并从中挑选的第三个选项。虽然这是一个看起来不错的答案,但实际上就单个调用的运行时间而言要密集得多。

在我看来,最好的答案是科波菲尔逐位构建数字。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2021-01-05
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多