簡體   English   中英

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)

我能想到的最簡單的方法是在范圍的開頭或結尾添加一些額外的數字,然后將這些額外的數字映射到您想要的數字。 使用您的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)

我得到它的工作做這個

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM