我正在为学校做一个小任务,我遇到了一些麻烦。该程序的目的是总结2个随机数的滚动36000次。数字应该在1-6的范围内(模拟骰子)。
然后我们计算每个求和值的频率并将其显示在控制台上。
看起来很容易,除了我在运行程序时得到一个不寻常的输出。当我在调试中运行程序时,它运行正常,所以我有点难过如何找到问题......
我正在使用一组计数器来计算值被滚动的次数。 我得到的输出看起来像这样: 5888 0 6045 0 6052 0 5969 0 6010 0 6036(每个值都在换行符上我只是为此类型输入以节省空间)
当我运行调试(F11)然后在单步执行后按F5时,我得到所需的输出:
973 2022 3044 3990 4984 6061 4997 4030 2977 1954 968
using System;
public class DiceRollUI
{
public static void Main(string[] args)
{
DiceRoll rollDice = new DiceRoll();
Random dice1 = new Random(); //dice 1
Random dice2 = new Random(); //dice 2
int len = 36000;
while( len > 0) {
rollDice.DiceRange((uint)dice1.Next(1, 7) +
(uint)dice2.Next(1,7)); //sum the dice and pass value to array
--len;
}
rollDice.DisplayRange(); //display contents of counter array
Console.ReadLine();
}//end Main method
}//end class DiceRollUI
using System;
public class DiceRoll
{
private uint[] rolledDice = new uint[11]; //counter array to count number of rolls
public void DiceRange(uint diceValue)
{
++rolledDice[diceValue - 2]; //offset values to place in correct element
}//end method DiceRange
public void DisplayRange()
{
for(int i = 0; i < rolledDice.Length; i++)
Console.WriteLine("{0}", rolledDice[i]);
}//end method DisplayRange
}//end class RollDice
答案 0 :(得分:7)
这是因为Random()
构造函数的工作方式。基于MSDN:
默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间中的滴答数采用Int32值。但是,因为时钟具有有限的分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列。
因此,Random
的两个实例每次实际生成相同的数字。
一个问题是,对于两个骰子卷只使用Random
的一个实例,因为你真的不需要其中两个。
Random dice = new Random();
int len = 36000;
while (len > 0)
{
rollDice.DiceRange((uint) dice.Next(1, 7) +
(uint) dice.Next(1, 7)); //sum the dice and pass value to array
--len;
}
答案 1 :(得分:1)
这是获取随机种子的另一种方法。你正在做的一切正常,除了你的随机数生成器看起来它们不是“真正”随机的,所以我会尝试这样的事情(给一个随机的基于系统的种子,然后给另一个随机的随机来自{ {1}}):
random1
这给了我预期的结果。在您进行调试一步之后程序正常工作的原因是因为您初始化一个随机,它获得一个随机种子,然后当您采取另一个步骤时,另一个随机生成与您的系统时钟不同的种子。
注意:对于将来的调试,您可能会注意到随机骰子总数只是2的因子,这可能导致猜测static void Main(string[] args)
{
DiceRoll rollDice = new DiceRoll();
Random dice1 = new Random(); //dice 1
System.Threading.Thread.Sleep(100); //get a different seed for dice 2
Random dice2 = new Random(); //dice 2
int len = 36000;
...
}
s生成相同的值。