【发布时间】:2017-06-27 14:53:51
【问题描述】:
假设如下实验:执行相同的伯努利试验(成功概率为P)N次
我需要以下信息:所有可能的成功/失败序列及其发生概率。
示例: 成功概率为 P = 40% 的 Bernouilli 实验执行 3 次将产生以下结果(S 为成功,F 为失败):
FFF 0.216
SFF 0.144
FSF 0.144
SSF 0.096
FFS 0.144
SFS 0.096
FSS 0.096
SSS 0.064
我试图暴力破解它以获得结果,但它仅在 N = 25 时迅速窒息,我得到了 OutOfMemoryException...
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace ConsoleApplication
{
class Program
{
static Dictionary<string, double> finalResultProbabilities = new Dictionary<string, double>();
static void Main(string[] args)
{
// OutOfMemoryException if I set it to 25 :(
//var nbGames = 25;
var nbGames = 3;
var probabilityToWin = 0.4d;
CalculateAverageWinningStreak(string.Empty, 1d, nbGames, probabilityToWin);
// Do something with the finalResultProbabilities data...
}
static void CalculateAverageWinningStreak(string currentResult, double currentProbability, int nbGamesRemaining, double probabilityToWin)
{
if (nbGamesRemaining == 0)
{
finalResultProbabilities.Add(currentResult, currentProbability);
return;
}
CalculateAverageWinningStreak(currentResult + "S", currentProbability * probabilityToWin, nbGamesRemaining - 1, probabilityToWin);
CalculateAverageWinningStreak(currentResult + "F", currentProbability * (1 - probabilityToWin), nbGamesRemaining - 1, probabilityToWin);
}
}
}
我需要能够及时支持最多 N = 3000(任意 P 不到 3 秒即可获得结果)
有没有一种数学方法可以最佳地做到这一点?
【问题讨论】:
-
为什么要存储所有结果?
P(F...S...F...S ) == P(S)**(number of S) * P(F)**(number of F) -
@DmitryBychenko 我需要找到最长连胜的平均值(例如,通过执行 0.216 * 0 + 0.144 * 1 + 0.144 * 1 + 0.096 * 2 + 0.144 * 1 + 0.096 * 1 + 0.096 * 2 + 0.064 * 3 = 1.104)
标签: c# algorithm math statistics bernoulli-probability