C#Dice Roll Probablity

时间:2018-01-10 22:26:52

标签: c#

我想证明在骰子上掷6的概率是1/6,并且连续两次滚动6的概率是1/36。我写的程序试图模仿这个过程。

更好地解释我的代码。 "尝试"掷骰子的次数。 " diceRoll"是我用来模仿滚动骰子的变量。 " successiveAttempts"是一个变量,它测量6是否连续滚动,如果没有,则重置while循环。我有一个重复10000次的while循环的原因是为了重复骰子滚动测试多次并获得结果的平均值。因为有时6次将连续两次滚动3次尝试或80次尝试,所以我想通过重复10000次来获得结果的平均值。

"百分比"尝试除以重复测试的次数,以获得每次掷骰子的平均尝试次数。当我将while循环中的数字更改为数字1时,它返回我程序中的数字6是正确的。它平均需要6次尝试以便滚动6.但是当我将数字更改为连续2次尝试时。我回来了42这是不真实的。它平均需要连续两次滚动6次的尝试次数是36次尝试。

当while循环中的数字是1 vs 2时,我无法弄清楚为什么程序正常工作。任何人都可以解释我哪里出错了?如果我的代码令人困惑,我很抱歉我是初学者,我很困惑。如果有人能帮助我,我会很乐意帮助你。

public static void Main(string[] args)
{
    Random numGen = new Random();
    int diceRoll = 0;
    int attempts = 0;
    int successiveAttempts = 0;
    int x = 0;

    while (x < 10000)
    {
        successiveAttempts = 0;
        while (successiveAttempts < 2)
        {
            diceRoll = numGen.Next(1,7);
            if (diceRoll == 6)
            {
                successiveAttempts++;
            } 
            else
            {
                successiveAttempts = 0;
            }
            attempts++;
        }
        x++;
    }
    int percentage = attempts/x;

    Console.WriteLine(percentage);
    Console.WriteLine(attempts);
    Console.ReadKey();
}

3 个答案:

答案 0 :(得分:2)

我不认为你在衡量你认为自己在衡量什么。你没有测试单独的试验,看“投掷N六的机会是多少?”。对于 你会做这样的事情:

public static void Main()
{
    Random numGen = new Random();
    int succeses = 0;

    const int TRIES = 10000;
    for(int i = 0; i < TRIES;i++)
    {
        bool allSixes = true;
        const int DICE_PER_TRY =2;
        for(int j = 0; j < DICE_PER_TRY; j++)
        {
            if(numGen.Next(1, 7) == 6)
            {
                // still good
            }
            else
            {
                allSixes = false;
                break; // might a well give up and
                       // **start the next test**
                       // (reset the test)
            }
        }
        if (allSixes) succeses++;
    }
    var triesPerSuccess = TRIES / succeses;

    Console.WriteLine(triesPerSuccess);
    Console.ReadKey();
}

主要区别在于您在正在进行的系列投掷中测量连续六。没有理由认为答案与36-in中有任何关系。

答案 1 :(得分:1)

为了给您提供另一种方法,请尝试以下代码:

var n = 1000000;
var rnd = new Random();
var trials = Enumerable.Range(0, n).Select(x => new { first = rnd.Next(1, 7), second = rnd.Next(1, 7) }).ToArray();
var pairsOfSixes = trials.Where(x => x.first == 6 && x.second == 6).Count();
var probability = (double)pairsOfSixes / n;

这给了我0.02778这样的值,它与0.0277777777777778(预期值)相距太远。

答案 2 :(得分:0)

好吧,正如马克,克里斯,埃里克和其他人写的那样,滚动连续数字的几率与滚动几个骰子并获得相同数字的机会不同 - 所以我的回答可能是多余的,但我在注释你可以在单循环中进行计算,如果你在我之前不接受,我会发一个答案,所以这里是:

public static void Main(string[] args)
{
    Random numGen = new Random();
    int success = 0, successiveAttempts = 0, tries = 10000;
    for( int  x = 0; x < tries; x++)
    {
        successiveAttempts = (numGen.Next(1, 7)== 6) ? successiveAttempts + 1 : 0;
        if(successiveAttempts > 1) 
            success++;
    }
    Console.WriteLine("{0} successive roles of 6 in {1} tries.", success, tries);
    Console.WriteLine("Ratio is {0}", tries/success);
}

请注意,它仍然没有返回您期望的1/36比率。为了获得这个速度,你应该每次尝试掷两个骰子,如Enigmativity的回答所示。