首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:保持最小距离的范围内的随机数字列表

Python:保持最小距离的范围内的随机数字列表
EN

Stack Overflow用户
提问于 2018-08-19 22:22:34
回答 3查看 6.2K关注 0票数 9

让我们假设这段代码random.seed(42) random.sample(range(0,40), 4)输出:[7, 1, 17, 15]我应该在这段代码中修改什么来生成随机数,其中列表中任意两个数字之间的最小距离将至少为10或更大。就像[0, 10, 25, 39] or [0, 12, 23, 38 ]一样。可能的重复项是this。谢谢。

EN

回答 3

Stack Overflow用户

发布于 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个元素被保证。

票数 2
EN

Stack Overflow用户

发布于 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]
票数 0
EN

Stack Overflow用户

发布于 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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51918580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档