[英]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
返回True
或False
。 在第一个版本中,我使用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.