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

时间:2019-06-26 14:42:01

标签: python rank random-seed

我有一个随机数生成器,正在尝试根据该数字产生结果。我在三个专栏中有三个结果。 “客场胜利”,“平局”,“主场胜利”,并具有这些事件的可能性。基于随机数函数,我想模拟一列预期结果。

       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_Away_Win”,因此我希望值“ 1”反映第1列。看下一行,概率是否小于最小值?否。是否小于最小值(0.11167)+下一个最小值(0.31267)?否。因此,我希望Expected_Res选择“ 3”,因为它是剩余的最后一列。对于数据帧的下一行,我再次想问一下,随机值是否小于可用的最小值。不可以。它小于可能的最小值'Prob_Away_Win(0.23312)+下一个最小值'Prob_Home_Win'(0.35453)= 0.58765。是。因此,选择列“ 2” Pro_Home_Win。

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

1 个答案:

答案 0 :(得分:0)

使用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