p1 * cost1 + p2 * cost2 + p3 * cost3 + ... = n
p1 + p2 + p3 + ... = 1
cost1,cost2,cost3,...
n
p1,p2,p3,...
我è¦åŽ»åšä¸€ä¸ªçº¸ç‰Œæ¸¸æˆï¼ˆé€—我玩)。现在我有很多ä¸åŒä»·æ ¼çš„å¡ï¼Œä¾‹å¦‚:
[
{
'name': 'card1',
'cost': 10
},
{
'name': 'card2',
'cost': 100
},
{
'name': 'card3',
'cost': 1000
},
{
'name': 'card4',
'cost': 10000
},
]
然åŽï¼Œæˆ‘希望这个游æˆçš„æ•°å¦æœŸæœ›ç‰äºŽ500
。所以我有一个想法,将数å¦æœŸæœ›åˆ†ä¸ºä¸åŒçš„部分,然åŽåˆ†åˆ«è®¡ç®—它们的概率。
[
{
'name': 'card1',
'cost': 10,
'math_expect': 3,
},
{
'name': 'card2',
'cost': 100,
'math_expect': 30,
},
{
'name': 'card3',
'cost': 1000,
'math_expect': 300,
},
{
'name': 'card4',
'cost': 10000,
'math_expect': 167,
},
]
现在我å¯ä»¥èŽ·å¾—æ¯å¼ å¡çš„概率。
p_card1 = 3 / 10 # 0.3
p_card2 = 30 / 100 # 0.3
p_card3 = 300 / 1000 # 0.3
p_card4 = 167 / 10000 # 0.0167
p_sum = p_card1 + p_card2 + p_card3 + p_card4 # 0.9167
如您所è§ï¼Œæ¦‚率总和ä¸ç‰äºŽ1ï¼Œå› æ¤æˆ‘必须指定一个新的概率p_no_card = 1 - p_sum = 0.0833
。实际上,如果我更改期望分布,则概率总和甚至大于1。
æ‰€ä»¥æˆ‘å†™äº†ä¸€ä¸ªæ„šè ¢çš„åµŒå¥—å¾ªçŽ¯æ¥åšåˆ°è¿™ä¸€ç‚¹ï¼š
cost1 = 10
cost2 = 100
cost3 = 1000
cost4 = 10000
for i in range(cost1):
for j in range(min(cost2, 500 - i)):
for k in range(min(cost3, 500 - i - j)):
l = 500 - i - j - k
p_sum = 1.0 * i / cost1 + 1.0 * j / cost2 + 1.0 * k / cost3 + 1.0 * l / cost4
if abs(p_sum - 1) < 0.0005:
print p_sum, i, j, k, l
通过这个嵌套循环,我å¯ä»¥èŽ·å¾—很多结果,并为我的游æˆé€‰æ‹©äº†æœ€ä½³é€‰æ‹©ã€‚但是,如果我è¦æ·»åŠ 更多的å¡ï¼Œä¾‹å¦‚100å¼ å¡ï¼Œæ¤å¾ªçŽ¯å°†å˜å¾—缓慢且ä¸ç²¾ç¡®ï¼ˆæ˜“于ç†è§£ï¼Œå¦‚果期望的æ¯ä¸ªéƒ¨åˆ†éƒ½å¤ªå°ï¼Œåˆ™èŒƒå›´æ¥é•¿1
会太大)。
那么我该如何快速而准确地分é…æ•°å¦æœŸæœ›å‘¢ï¼Ÿä¸€ä¸ªä¸»æ„就足够了。我å¯ä»¥è‡ªå·±å®žçŽ°ç›¸åº”的代ç 。