繁体   English   中英

具有给定密度的 Python 随机值

[英]Python Random Values with a Given Density

假设我想建立一个迷宫,每个位置都有一定概率的障碍物。 该概率由 0 到 10 的密度值决定,0 表示“没有机会”,10 表示“确定”。

这个 Python 代码能做我想要的吗?

import random

obstacle_density = 10
if random.randint(0, 9) < obstacle_density:
    print("There is an obstacle")

我尝试了上下界和不等式的各种组合,这似乎可以解决问题,但我很怀疑。 一方面, obstacle_density random.randint(0, 9) 11 个可能的值,而random.randint(0, 9)只有 10 个。

不太确定您的解决方案。 不过,似乎它会起作用。 这是我将如何处理它,即使它有点多余 - 我会从一个表格开始,仅供我自己参考:

density | probability of obstacle
---------------------------------
 0      |   0%
 1      |  10%
 2      |  20%
 3      |  30%
 4      |  40%
 5      |  50%
 6      |  60%
 7      |  70%
 8      |  80%
 9      |  90%
10      | 100%

这似乎加起来了。 我提出了一个函数的两个版本,它根据density返回TrueFalse 在第一个版本中,我使用density来创建与random.choices一起使用的关联权重(在这种情况下,总权重为 100)。 例如,如果density = 3 ,则weights = [30, 70] - 30% 为True , 70% 为False

def get_obstacle_state_version_1(density):
    from random import choices

    assert isinstance(density, int)
    assert density in range(0, 11) # 0 - 10 inclusive

    true_weight = density * 10
    false_weight = 100 - true_weight

    weights = [true_weight, false_weight]

    return choices([True, False], weights=weights, k=1)[0]

这是第二个版本,其中我使用random.choice而不是random.choices 后者总是返回一个样本列表,即使样本大小k为 1。这里的想法是相同的,但基本上密度会影响出现在要采样的总体中的True s 和False s 的数量。 例如,如果density = 3 ,则random.choice将从具有均匀分布的 30 个True和 70 个False的列表中选择一个元素。

def get_obstacle_state_version_2(density):
    from random import choice

    assert isinstance(density, int)
    assert density in range(0, 11) # 0 - 10 inclusive

    true_count = density * 10
    false_count = 100 - true_count

    return choice([True] * true_count + [False] * false_count)

您应该遍历迷宫并在每个站点分配一个概率。 你应该做这样的事情:

probability = random.randint(0, 10) / 10

我不知道你说的obstacle_density密度是什么意思,所以我不会去那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM