根据随机数生成生成结果值

Produce outcome values based on random number generate

我有一个随机数生成器,我正在尝试根据这个数字生成结果。我在三列中有三个结果。 'Away Win'、'Draw'、'Home Win' 并具有这些事件的概率。基于随机数函数,我想模拟一列预期结果。

       Prob_Away_Win  Prob_Draw  Prob_Home_Win  Random_Value  Expected_Res
    0  0.14588        0.37896    0.58646        0.12457       1
    1  0.11167        0.31267    0.57566        0.78643       3
    2  0.23312        0.41235    0.35453        0.27642       2
    3  0.44532        0.32112    0.23358        0.18754       3
    4  0.83216        0.12980    0.03804        0.43823       1
    5  0.21334        0.09897    0.68769        0.16721       1

因此,例如。查看第一行,随机值为 0.12457,我想首先问这个值是否小于三个 'Prob' 列中任何可用的最小概率。是的,它小于 'Prob_Away_Win',所以我希望值“1”反映第 1 列。查看下一行,概率是否小于最小值?不。所以..它是否小于最小值(0.11167)+下一个最小值(0.31267)?不,因此我希望 Expected_Res 选择“3”,因为它是剩下的最后一列。对于 Dataframe 的下一行,我想再次询问随机值是否小于可用的最小值。不,它小于可能的最小值,'Prob_Away_Win (0.23312) + 下一个最小值 'Prob_Home_Win' (0.35453) = 0.58765。是的。所以选择“2”列 Pro_Home_Win.

我如何创建一个函数来计算这个?

使用 itertools.accumulateitertools.takewhile 的实现:

data = '''       Prob_Away_Win  Prob_Draw  Prob_Home_Win  Random_Value  Expected_Res
    0  0.14588        0.37896    0.58646        0.12457       1
    1  0.11167        0.31267    0.57566        0.78643       3
    2  0.23312        0.41235    0.35453        0.27642       2
    3  0.44532        0.32112    0.23358        0.18754       3
    4  0.83216        0.12980    0.03804        0.43823       1
    5  0.21334        0.09897    0.68769        0.16721       1'''

import re
from itertools import accumulate, takewhile

tbl = []
for g in re.findall(r'\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)\s*([\d.]+)', data):
    l = [*map(float, g)]
    tbl.append(l)

for row in tbl:
    probs = sorted(enumerate(row[1:4], 1), key=lambda k: k[1])
    random_value = row[4]
    t = takewhile(lambda p: random_value>p[1], accumulate(probs, lambda a, b: (b[0], a[1] + b[1])))
    idx = probs[sum(1 for _ in t)][0]
    print('{}\t{}\t{}'.format(int(row[0]),
        ' '.join('{: <{}}'.format('(*)' + s if i==idx else s, 12) for i, s in enumerate(map(str, row[1:5]), 1)  ),
        idx))

打印:

0   (*)0.14588   0.37896      0.58646      0.12457      1
1   0.11167      0.31267      (*)0.57566   0.78643      3
2   0.23312      0.41235      (*)0.35453   0.27642      3
3   0.44532      0.32112      (*)0.23358   0.18754      3
4   (*)0.83216   0.1298       0.03804      0.43823      1
5   (*)0.21334   0.09897      0.68769      0.16721      1