【问题标题】:one liner to generate a random number between 0 and 100 but last digit ends in 0, 1, 2, 3, 4一个班轮生成一个介于 0 和 100 之间的随机数,但最后一位数字以 0、1、2、3、4 结尾
【发布时间】:2017-05-31 23:42:06
【问题描述】:

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


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

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

一旦生成了幂等随机数,我需要一个算术函数将数字投影到最后一位在0到4之间的另一个整数,并且仍然保证幂等性

【问题讨论】:

  • 你能用模数吗?
  • 随机数模数除以 4。
  • 生成0到49的随机数,然后翻转。
  • 你做了哪些研究?对于 4k 代表用户,我有点惊讶您会在没有提供任何研究或 MCVE 的情况下发布问题。

标签: python random ansible jinja2


【解决方案1】:

经过 cmets 中的一些讨论,如果您在范围 (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) 范围内生成的任何数字转换为满足您的

【讨论】:

  • 你是巫师吗?谢谢!是否可以进一步简化公式,让x变量只出现一次?
【解决方案2】:

这是使用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

【讨论】:

  • 谢谢!我编辑了问题以反映背景故事。最好我希望某种算术函数直接映射到另一个数字。
  • @est 现在,您的问题正朝着另一个新方向发展
【解决方案3】:

如果您不介意拒绝 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)

【讨论】:

  • 这就是为什么我问我们是否可以排除 100 :-),但现在看来 OP 正在某个未指定的范围内生成他自己的随机数,并且他想要从那个映射到他的目标集.
  • @DSM 我们可以假设我希望 [0,1,2,3,4,5,....49] 映射到 [0,1,2,3,4,10,11,12,13,...,95] 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
相关资源
最近更新 更多