一个衬垫生成0到100之间的随机数,但最后一个数字以0,1,2,3,4结束

时间:2017-01-17 02:30:13

标签: python random ansible jinja2

如果没有连字符串或if条件等,请使用算术单线程。最好用Python编写。

故事背景:遗留系统需要一个侦听端口,最后一个数字以[0-4]结尾,因此[5-9]保留给镜像TCP。

我编写了一个生成idempotent random number的部署脚本,但无法保证[0-4]中的最后一位数字。自Ansible& Jinja2模板语言是有限的,所以我不希望代码过多依赖毛茸茸的字符串操作和if条件。

一旦生成幂等随机数,我需要一个算术函数来数字投射到另一个整数,最后一个数字介于0和4之间,仍然保证幂等性

3 个答案:

答案 0 :(得分:4)

在评论中进行一些讨论后,如果您在范围(0,50)中随机选择了一个数字y = 10*(x//5) + x % 5 ,则可以将其映射到{0,1,2,3,4,10 ,11,...}像这样:

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]

例如:

{{1}}

这会将您在[0,50)范围内生成的任何数字转换为满足您的< 0> 5 mod 10标准。

答案 1 :(得分:1)

以下是使用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和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

答案 2 :(得分:0)

如果你不介意不允许100,你可以简单地生成两个随机数,一个在0到9之间,另一个在0到4之间,并将它们算术结合起来。

port = 10 * random.randint(0,9) + random.randint(0,4)

统一选择50个这样的端口中的任何一个。

在混音中添加100的最简单方法是简单地生成0到50(包括0和50)之间的随机数,并将其中一个作为100的代理,其余表示另一个使用上述方案生成随机数。

port = 100 if random.randint(0,50) == 50 else 10 * random.randint(0,9) + random.randint(0,4)