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
>>>
我能想到的最简单的方法是在范围的开头或结尾添加一些额外的数字,然后将这些额外的数字映射到您想要的数字。使用您的 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)
我正在尝试在 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
>>>
我能想到的最简单的方法是在范围的开头或结尾添加一些额外的数字,然后将这些额外的数字映射到您想要的数字。使用您的 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)