簡體   English   中英

如何生成介於最小和最大位數之間的隨機數? (Python)

[英]How to generate a random number between a minimum and maximum number of digits? (Python)

例如,用戶可以指定最少 2(兩位數)和最多 4(四位數),並且數字必須介於 10 和 9999 之間。輸入始終為 integer。

我已經設法做到這一點,以便數字始終具有最大位數,但我無法弄清楚如何包含最小數字。

想到的第一種方法是將所需的數字位數轉換為整數; 即,如果您想要最少 9 位數字,則此類數字的最大值為 999,999,999,因為這是最大的 9 位數字。 如果你想要最少 2 位數字,那么這樣的數字的最小值為 10,因為這是最小的 2 位數字。

弄清楚之后,您可以使用十的冪來計算所需的范圍:

mindigits = 2
maxdigits = 9

num = random.randrange(10**(mindigits-1), 10**maxdigits)

並獲得該范圍內的數字。

但是您的很多號碼都是 9 位數字,很少是 2 位數字。 事實上,您可能認為它總是通過隨意測試生成長數字。 為什么? 因為 9 位數字的數量是 8 位數字的十倍,而 8 位數字的數量是 7 位數字的十倍,依此類推。 在那個范圍內,兩位數的數字是非常罕見的!

平均而言,以這種方式生成的 2 到 9 位之間的隨機數中,大約 90% 的長度為 9 位,這意味着其他長度總共占 10%。 不相信我? 試試這個:

from collections import Counter
from random import randint
Counter(len(str(randint(10, 999_999_999))) for _ in range(999))

在我的機器上運行的示例產生了以下 output:

Counter({9: 906, 8: 87, 7: 5, 5: 1})

因此,在這次運行中生成的 1000 個隨機數中,沒有長度為 2、3、4 或 6 的隨機數。

如果您想要數字位數的均勻分布,請單獨生成數字。 唯一的技巧是,您生成的第一個數字不能為零,因此您需要從 1-9 的范圍內生成它。 所以我們從 rest 中單獨生成一個。我們可以使用生成器表達式生成其他數字,將所有內容組合成一個字符串,然后將其轉換為 integer。

mindigits = 2
maxdigits = 9

num = int(str(random.randint(1, 9)) + "".join(str(random.randint(0, 9)) 
        for _ in range(random.randrange(mindigits-1, maxdigits))))

使用random.randint()

import random

min_digits = # enter here
max_digits = # enter here

# This is how you can turn the minimum and maximum number of digits into the range for the final number
min_value = 10**(min_digits - 1)
max_value = (10**max_digits) - 1

# Input these values into the randint function
print(random.randint(min_value, max_value))

使用randrange(start, stop)

另外,您可能需要像start = 10 ** 2stop = 10 ** 4這樣的表達式來描述具有特定位數的數字。

確保導入 math、random 和 randint 模塊/庫:

random.randint(10,9999)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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