从字典

时间:2016-10-21 11:20:47

标签: python-2.7 dictionary

我在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多出squirrelsnake。我怎样才能根据dict的价值创建动物的概率?我希望它能让用户看到更高百分比的动物价值更低,动物价值更高的动物比例更高。

例如:

用户应该看到动物的值为1到5,50%的时间(0.5),动物的值为6%到50%,25%的时间(0.25),以及任何有动物的动物价值高于10%的时间(0.10)。

1 个答案:

答案 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,我会留下你需要切换的评论