根据百分比机会从列表中返回唯一结果

时间:2016-05-10 19:49:44

标签: python list python-3.x random percentage

我有两个很长的名单。 示例:

}

玩家数量可以改变:

good = ["Good thing1", "Good thing2", "Good thing3", "Good thing4", "Good thing5", ...]
bad = ["Bad thing1", "Bad thing2", "Bad thing3", "Bad thing4", "Bad thing5", ...]

每位玩家有43%的可能性会发生好事(或者有57%的可能性会发生坏事)。没有两个球员可以有相同的好或坏结果。

我试图做这样的加权结果:

players = 5

但我得到重复。如果我这样做,那么加权结果就会变得不加权,如下例所示:

weighted_outcome = good * 43 + bad *57
random.sample(weighted_outcome, 5) # Where 5 is the number of players

我是否正确假设加权的唯一方法是创建一个新的唯一加权列表?就像在这个例子中我有70%的好结果和30%的糟糕结果:

weighted_outcome = good * 43 + bad *57
random.sample(list(set(weighted_outcome)), 5) # Where 5 is the number of players

我觉得这仍然是错误的,因为在70%的情况下,每位球员都应该有机会发生一些好事,并且每个球员都有可能发生不好的事情。

1 个答案:

答案 0 :(得分:1)

为什么不能使用if?这是一个例子

from random import randint
good_things = [good1, good2]
bad_things = [bad1, bad2]
players = [player1, player2]
temp_good_things = good_things[:]  # coping the lists
temp_bad_things = bad_things[:]
chance_for_good = 47
for player in players:
    if randint(0, 100) <= change_for_good:
        good_thing = get_random_element(temp_good_things)
        temp_good_things.remove(good_thing)
        player.do_thing(good_thing)
    elif:
        bad_thing= get_random_element(temp_bad_things)
        temp_bad_things.remove(bad_thing)
        player.do_thing(bad_thing)  

为玩家提供唯一things的关键是从列表中删除已使用的元素。为了节省基数things,我将列表复制到临时列表中。