我在python中创建了一种生存游戏,并创建了你可以遇到的不同动物和“战斗”(用户只会遇到一只动物)在一个时间)。我希望某些与它们相关的数量较少的动物有更高的概率出现,然后出现与它们相关的较高数量的动物:
POSSIBLE_ANIMALS_ENCOUNTERED = {
"deer": 50, "elk": 75, "mountain lion": 150,
"rat": 5, "raccoon": 15, "squirrel": 5,
"black bear": 120, "grizzly bear": 200, "snake": 5,
}
所以,我希望rat
看起来比deer
多出squirrel
或snake
。我怎样才能根据dict
的价值创建动物的概率?我希望它能让用户看到更高百分比的动物价值更低,动物价值更高的动物比例更高。
例如:
用户应该看到动物的值为1到5,50%的时间(0.5),动物的值为6%到50%,25%的时间(0.25),以及任何有动物的动物价值高于10%的时间(0.10)。
答案 0 :(得分:1)
您需要根据“健康点”(encounter_ranges
元组来自编辑中的数据)来编码遭遇的百分比可能性,然后从元素中进行加权随机选择。我已将评论内联:
from random import random
from bisect import bisect
POSSIBLE_ANIMALS_ENCOUNTERED = {
"deer": 50, "elk": 75, "mountain lion": 150,
"rat": 5, "raccoon": 15, "squirrel": 5,
"black bear": 120, "grizzly bear": 200, "snake": 5,
}
# codify your ranges. (min, max, encounter %)
encounter_ranges = (
(50, float('inf'), .10),
(6, 50, .25),
(1, 5, .50)
)
# create a list of their probability to be encountered
# replace .items() with .iteritems() if python 2.x
ANIMAL_ENCOUNTER_PERCENTAGE_PER_HP_LIST = []
for k, v in POSSIBLE_ANIMALS_ENCOUNTERED.items():
for encounter_chance in encounter_ranges:
if (v >= encounter_chance[0]) and (v <= encounter_chance[1]):
# multiplied by 100 because we're going to use it in a weighted random below
ANIMAL_ENCOUNTER_PERCENTAGE_PER_HP_LIST.append([k, encounter_chance[2] * 100])
# With our percentages in hand, we need to do a weighted random distribution
# if you're only planning on encountering one animal at a time.
# stolen from http://stackoverflow.com/a/4322940/559633
def weighted_choice(choices):
values, weights = zip(*choices)
total = 0
cum_weights = []
for w in weights:
total += w
cum_weights.append(total)
x = random() * total
i = bisect(cum_weights, x)
return values[i]
# run this function to return the animal you will encounter:
weighted_choice(ANIMAL_ENCOUNTER_PERCENTAGE_PER_HP_LIST)
请注意,此方法将始终返回某些内容 - 100%偶然遇到某些动物。如果你想让遭遇更随机,这是一个更简单的问题,但我没有包括它,因为你需要指定你对这个游戏机制的工作方式(任何遭遇的随机0-100%的机会?)基于回归的遭遇百分比几率(如果回归大鼠则有50%的遭遇机会)?等等。
请注意,我为Python 3编写了这个,好像你是Python的新手一样,你真的应该使用3.x,但如果你决定坚持使用2.x,我会留下你需要切换的评论