概率代码问题

时间:2010-10-17 21:09:24

标签: c# statistics

当我使用isWinConfidence切换isWinDefault时,我得到了截然不同的结果。我觉得他们应该是一样的。我的代码或统计数据中是否存在我误解的错误?

此测试旨在模拟单次硬币1倍与硬币翻转多次。

问题是

如果P(x)是70%那么p(x)* 100应该是> 70 = 70%的时间,没有?

感谢。

    private void TestWin()
    {
        double headsUp = 0;
        double testRuns = 100;
        for (double i = 0; i < testRuns; i++)
        {
            if (IsWinConfidence())
            {
                headsUp++;
            }

        }
        label1.Text = "Probability of Heads is " + headsUp /testRuns;

    }

    private bool IsWinDefault()
    {
        if (r.NextDouble() <= .7)
        {
            return true;
        }
        return false;
    }

    private bool IsWinConfidence()
    {
        int headsCount = 0;
        for (double x = 0; x < 100; x++)
        {
            if (IsWinDefault())
                headsCount++;

        }

        double pHeadsCount = headsCount / 100d;
        if (pHeadsCount >= .7 )
        {
            return true;
        }
        else
        {
            return false;
        }


    }

6 个答案:

答案 0 :(得分:2)

这是一个简单的答案:

70%的概率意味着平均,100次硬币翻转将产生70个抬头。然而,它有时会超过70,有时甚至更少。

换句话说,每批100次硬币翻转你将获得的抬头数量将接近70.有时低于70,有时高于70,有时恰好70。

因此,如果这个数字在70左右摆动,那么只有当你问“它有多少经常超过70,或者等于70”时,你才能得到一个答案“大约50%的答案”。时间”。

所以你没有在那里用你的代码问正确的问题。

事实上,将IsWinConfidence循环中的数字增加到更高的数字会给你一个接近50的数字。


让我们在这里挑选你的论点。

你说如果你有:

  

有偏见的硬币,有70%的时间会抬头抬头,30%的时间抬头抬头

然后你说的是:

  

如果我将硬币翻转100次,我应该超过70个抬头

一个人不会导致另一个,你的论点存在缺陷。概率不是关于保证,而是关于平均值。

如果概率是绝对的,那么你的第二个陈述应该是:

  

如果我将硬币翻转100次,我应该抬头70次

请注意这里缺少“超过”。

相反,第一个参数意味着:

  

如果我将硬币翻转100次,然后翻转100次,再翻100次,再翻100次,依此类推,那么平均每100次翻转将有70个抬头

现在,我不太了解概率计算来分离你的循环和计数,但我知道只是遵循逻辑,你的论证失败了。

让我们尝试另一种方法。

如果硬币是均匀的,虽然有偏见,但这意味着在100次硬币翻转中,你有时会超过70,有时甚至不到70。

在我天真的想法中,这意味着......平均而言,一半时间内你只能获得超过70次硬币翻转。

通过将循环中的数字增加到100.000,我得到置信度函数以接近50。这似乎支持了我的理论。

但正如我所说,我作为专家(甚至是dabbler)的可能性小于零。

答案 1 :(得分:1)

  

如果P(x)是70%那么p(x)* 100   是&gt; = 70%的时间,没有?

没有。信心与这种可能性无关......

你正在做的是第二种方法是抛弃有偏见的硬币100次,如果你得到70或者更多的头,则返回true。因为你已经固定了你的硬币,所以平均来说,70%的时间可以让你在“有时”100次投掷中获得70个头,但是“有时”不是70%的时间。

答案 2 :(得分:1)

IsWinDefault“赢得”70%的时间,正如预期的那样; IsWinConfidence“胜出”约53.77%,所以你应该看到接近这个数字。 有关详情,请参阅binomial distribution

答案 3 :(得分:0)

<强>更新

第一个函数在70%的时间内返回true,因此headsCount将以非常高的概率等于~70(如果100将被更大的数字替换,如果将倾向于该数字的70%)。

因此

pHeadsCount >= .7

有50%的概率,wince值将为〜0.7。

答案 4 :(得分:0)

if (r.NextDouble() <= .7)

VS

if (pHeadsCount >= .7 )

答案 5 :(得分:0)

概率是一个计数问题。计算每个类类型(0 头 1 尾)的出现,然后除以总数。几率是概率的函数。赔率告诉您翻转时出现正面或反面的可能性。

from collections import Counter

flips=10000

data=[]
for i in range(flips):
    data.append(random.choice([0,1]))

dictProbability={}
for key,value in Counter(data).items():
    dictProbability[key]=value/flips

print(dictProbability)

输出:

{0: 0.5014, 1: 0.4986}
 .5 probability of heads
 .49 probability of tails

伯努利二项式分布