我想证明在骰子上掷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();
}
答案 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的回答所示。