根据随机数生成生成结果值
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.accumulate
和 itertools.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
我有一个随机数生成器,我正在尝试根据这个数字生成结果。我在三列中有三个结果。 '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.accumulate
和 itertools.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