簡體   English   中英

一個 liner 生成一個 0 到 100 之間的隨機數,但最后一位數字以 0、1、2、3、4 結尾

[英]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.samplemod實現的一種方法:

>>> 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.

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