[英]How to generate a random number between a minimum and maximum number of digits? (Python)
[英]Python random module: How can I generate a random number which includes certain digits?
我正在嘗試在 Python 中生成一個隨機數,但我需要它包含某些數字。
假設我想要的范圍在 100000 到 999999 之間,所以我希望它在該范圍內,但也包括 1、4 和 5 等數字。
有沒有辦法做到這一點?
您可以逐位構建數字
>>> 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
>>>
對我來說,顯而易見的答案是蠻力。
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 在他們的回答中很好地說明了生成可接受數字列表並從中挑選的第三個選項。 雖然這是一個看起來不錯的答案,但它實際上在單個調用的運行時間方面更加密集。
我認為最好的答案是科波菲爾逐位構建數字。
創建一組所需的數字作為字符串,並創建一個有效數字列表,其中所需的整數出現在數字的字符串表示上使用set.intersection
。 然后使用random.choice
到 select 一個來自有效列表的隨機數:
import random
required = set(map(str, [1,4,5]))
valid_numbers = [int(num) for num in map(str, range(100000,1000000)) if required.intersection(num)]
random.choice(valid_numbers)
我能想到的最簡單的方法是在范圍的開頭或結尾添加一些額外的數字,然后將這些額外的數字映射到您想要的數字。 使用您的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)
import random, string
from random import randrange
a_list = [1,4,5]
A = random.choice( a_list) #these are your 3 numbers
B = randrange(100000, 9999999) # your own chosen range
result= f'({A})-{B}'
print(result)
(4)-1760765
(5)-6229821
(1)-3093513
(1)-1381767
(5)-2117529
import random
random.randint(100000, 999999)
如果我正確理解您的問題,這應該是您想要的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.