![](/img/trans.png)
[英]How to Generate random code with 4 digit string and 4 digit number in Python?
[英]one liner to generate a random number between 0 and 100 but last digit ends in 0, 1, 2, 3, 4
如果沒有 concat 字符串或if
條件等,請使用算術單行。 請最好用Python編寫。
故事背景:舊系統需要偵聽端口的最后一位數字以 [0-4] 結尾,因此 [5-9] 保留用於鏡像 TCP。
我編寫了一個部署腳本,它生成冪等隨機數,但無法保證 [0-4] 中的最后一位數字。 由於 Ansible 和 Jinja2 模板語言是有限的,所以我不希望代碼過於依賴毛茸茸的字符串操作和if
條件。
生成冪等隨機數后,我需要一個算術函數將數字投影到另一個整數,最后一位數字在 0 到 4 之間,並且仍然保證冪等性
在評論中進行了一些討論后,如果您在范圍(0,50)中隨機選擇了一個數字x
,則可以像這樣將其映射到 {0,1,2,3,4,10,11,...} :
y = 10*(x//5) + x % 5
例如:
In [8]: out = [10 * (x//5) + x % 5 for x in range(50)]
In [9]: out[:10]
Out[9]: [0, 1, 2, 3, 4, 10, 11, 12, 13, 14]
In [10]: out[-10:]
Out[10]: [80, 81, 82, 83, 84, 90, 91, 92, 93, 94]
這會將您在 [0,50) 范圍內生成的任何數字變成滿足 < 5 mod 10 標准的數字。
這是使用random.sample
和mod
實現的一種方法:
>>> import random
>>> [i for i in random.sample(range(100), 100) if i%10<5]
[24, 23, 62, 90, 80, 12, 4, 30, 43, 92, 21, 33, 41, 63, 52, 44, 81, 61, 31, 70, 73, 20, 0, 74, 2, 84, 11, 53, 13, 42, 50, 64, 60, 32, 71, 34, 72, 51, 1, 22, 91, 94, 40, 14, 82, 93, 3, 83, 54, 10]
您可以使用next
和 a gen。 exp 生成單個數字:
>>> gen = (i for i in random.sample(range(101), 101) if i%10<5) # include 100 in sample
>>> next(gen)
72
>>> next(gen)
84
>>> next(gen)
51
>>> next(gen)
71
>>> next(gen)
34
>>> next(gen)
40
如果您不介意禁止 100,您可以簡單地生成兩個隨機數,一個介於 0 和 9 之間,另一個介於 0 和 4 之間,然后以算術方式將它們組合起來。
port = 10 * random.randint(0,9) + random.randint(0,4)
這將統一選擇 50 個這樣的端口中的任何一個。
將 100 添加到組合中的最簡單方法是簡單地生成 0 到 50(含)之間的隨機數,並將其中一個作為 100 的代理,其余表示使用上述方案生成另一個隨機數。
port = 100 if random.randint(0,50) == 50 else 10 * random.randint(0,9) + random.randint(0,4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.