让我们假设这段代码random.seed(42) random.sample(range(0,40), 4)
输出:[7, 1, 17, 15]
我应该在这段代码中修改什么来生成随机数,其中列表中任意两个数字之间的最小距离将至少为10或更大。就像[0, 10, 25, 39] or [0, 12, 23, 38 ]
一样。可能的重复项是this。谢谢。
发布于 2018-08-19 22:34:51
一旦你生成了一个数字,它就会移出你的范围,因为你知道任何数字都不能在原始数字的+/- 10之内。
要实现这一点,一种天真的方法是列出剩余的数字,并在每次选择一个数字时将其分成几块:
domain = list(range(40))
result = []
while domain:
n = random.choice(domain)
result.append(n)
domain = [x for x in domain if x <= n - 10 or x >= x + 10]
请记住,每个样本最多可从您的域中删除19个元素。这意味着你不能保证在结果中得到4个元素,但至少有3个元素被保证。
发布于 2018-08-19 23:03:14
由于4个数字必须保持10的距离,这就留下了40个数字中仅有10个的“回旋余地”,以便4个数字随机分布(因为40 -3* 10 = 10)。因此,您可以简单地在10个数字的房间内随机选择4个数字,计算增量,然后添加增量和相应的10,以获得完整的列表。
import random
d = sorted(random.randint(0, 9) for _ in range(4))
o = [b - a for a, b in zip([0] + d[:-1], d)]
print([i * 10 + sum(o[:i + 1]) for i in range(4)])
以下是10次运行的示例:
[1, 13, 24, 37]
[4, 17, 27, 39]
[0, 10, 23, 33]
[1, 12, 27, 37]
[0, 13, 24, 35]
[3, 14, 27, 39]
[0, 11, 21, 38]
[1, 14, 26, 37]
[0, 11, 23, 39]
[1, 15, 28, 38]
发布于 2018-08-19 22:45:14
根据您想要的发行版,您可以这样做:
import random
def random_separated(n, start, stop, gap):
numbers = []
for i in range(n):
while True:
num = random.randint(start, stop)
if all(n - gap < num < n + gap
for n in numbers):
break
numbers.append(num)
return numbers
https://stackoverflow.com/questions/51918580
复制相似问题