Python RNG只选择较低的数字?

时间:2017-09-27 05:44:27

标签: python

我一直在为我的Twitch机器人制作一个插槽脚本,但出于某种原因,它对前两个选项的权重非常大。我甚至已经删除了所有平衡的东西,所以它只有六分之一的机会产生6个表情中的每一个。

此外,免责声明,我以前从未使用过python,所以请原谅我糟糕的代码。

rangeb = ["Kappa", "DansGame", "SMOrc", "OSfrog", "KAPOW", "KappaPride"] 

intcap = 6
kappa = 6
kapow = 5
osfrog = 4
smorc = 3
dansgame = 2


total1 = random.randrange(1, intcap)

total2 = random.randrange(1, intcap)

total3 = random.randrange(1, intcap)

if total1 >= kappa:
    emote1 = 5
elif total1 >=kapow:
    emote1 = 4
elif total1 >=osfrog:
    emote1 = 3
elif total1 >=smorc:
    emote1 = 2
elif total1 >=dansgame:
    emote1 = 1
else:
    emote1 = 0

if total2 >= kappa:
    emote2 = 5
elif total2 >=kapow:
    emote2 = 4
elif total2 >=osfrog:
    emote2 = 3
elif total2 >=smorc:
    emote2 = 2
elif total2 >=dansgame:
    emote2 = 1
else:
    emote2 = 0

if total3 >= kappa:
    emote3 = 5
elif total3 >=kapow:
    emote3 = 4
elif total3 >=osfrog:
    emote3 = 3
elif total3 >=smorc:
    emote3 = 2
elif total3 >=dansgame:
    emote3 = 1
else:
    emote3 = 0

Parent.SendTwitchMessage(rangeb[emote1])
Parent.SendTwitchMessage(rangeb[emote2])
Parent.SendTwitchMessage(rangeb[emote3])

这个想法是让它“旋转”,产生3个表情并在聊天中单独显示,然后告诉用户他们是否赢了。事实上,它几乎总是显示前三个表情之一,Kappa,DansGame或SMorc。理想情况下,每个表情的百分比值应为30,25,20,12,8,5,其中30为Kappa,5为KappaPride。不知道为什么它永远不会真正随意地选择它们。

1 个答案:

答案 0 :(得分:1)

NumPy的随机模块提供choice函数,该函数将选择具有指定概率的解(p中的项必须总和为1):

import numpy as np
choice1 = np.random.choice(["Kappa", "DansGame", "SMOrc", "OSfrog", "KAPOW", "KappaPride"], p=[ 0.3 ,  0.25,  0.2 ,  0.12,  0.08,  0.05])`.

如果你想坚持使用Python附带的普通随机模块,解决方案是按照结果的可能性按比例重复输入:

import random

l = []
l.extend(["Kappa"]*30)
l.extend(["DansGame"]*25)
l.extend(["SMOrc"]*20)
l.extend(["OSfrog"]*12)
l.extend(["KAPOW"]*8)
l.extend(["KappaPride"]*5)

choice1 = random.choice(l)

通过以下列方式耦合定义,您可以拥有更易于维护的代码:

name_list = [('Kappa', 30), ('DansGame', 25), ('SMOrc', 20), ('OSfrog', 12), ('KAPOW', 8), ('KappaPride', 5)]
l = []
for name, number in data:
    l.extend([name]*number)