C# 随机数生成循环生成相同的数
我对C#还是个新手,我正在尝试构建一个模拟掷硬币X次的短程序:C# 随机数生成循环生成相同的数,c#,for-loop,random,C#,For Loop,Random,我对C#还是个新手,我正在尝试构建一个模拟掷硬币X次的短程序: // Declarations int headCount = 0; int tailCount = 0; // Main Program Logic Console.WriteLine("Press enter to begin"); Console.ReadLine(); for (int x = 1; x <
// Declarations
int headCount = 0;
int tailCount = 0;
// Main Program Logic
Console.WriteLine("Press enter to begin");
Console.ReadLine();
for (int x = 1; x <= 25; x++)
{
Random rnd = new Random();
int flip = rnd.Next(1, 3);
if (flip == 1)
{
Console.WriteLine("Heads");
headCount++;
}
else
{
Console.WriteLine("Tails");
tailCount++;
}
}
Console.WriteLine("Heads came up {0} times.", headCount);
Console.WriteLine("Tails came up {0} times.", tailCount);
if (headCount > tailCount)
{
Console.WriteLine("Heads wins.");
}
else
{
Console.WriteLine("Tails wins.");
}
// END OF DOCUMENT
Console.ReadLine();
}
//声明
内部人员编制=0;
int tailCount=0;
//主程序逻辑
Console.WriteLine(“按enter键开始”);
Console.ReadLine();
用于(整数x=1;x尾数)
{
控制台。WriteLine(“头赢”);
}
其他的
{
控制台。WriteLine(“尾巴赢”);
}
//文件末尾
Console.ReadLine();
}
现在,我确信我的代码是可靠的,但是,我在运行程序时遇到了一个问题。在上面的代码中,思想是每次执行for循环时都会生成一个新的随机数(1或2)。实际上,10次中有9次,它第一次生成一个数字,然后将该数字用于循环的其余执行
每个人都有一段时间,结果大约是50/50(你在统计上会期望的),但通常是相同的结果重复25次
注意,我在循环中声明了flip变量。我在循环中前后移动了它,就在循环之前,更改似乎没有任何效果
我做错了什么,还是C#喜欢抛出统计异常?你需要在循环之外初始化随机数生成器
Random rnd = new Random();
Console.WriteLine("Press enter to begin");
Console.ReadLine();
for (int x = 1; x <= 25; x++)
当然,它的使用不如random友好(因为它提供的是随机字节而不是整数),但它提供了更好的随机性。但是,此随机数生成器足以用于加密,而as random不应用于加密。您需要在循环外部初始化随机数生成器
Random rnd = new Random();
Console.WriteLine("Press enter to begin");
Console.ReadLine();
for (int x = 1; x <= 25; x++)
当然,它的使用不如random友好(因为它提供的是随机字节而不是整数),但它提供了更好的随机性。但是,此随机数生成器足以用于加密,因为as random不应用于加密。原因是您一直在调用
new random()
。相反,您应该在循环外部构造它,然后调用。next(int,int)
Random rnd=new Random();
对于(int x=1;x原因是您一直在调用new Random()
。相反,您应该在循环外部构造此函数,然后调用。下一步(int,int)
Random rnd=new Random();
对于(int x=1;x
这是您的问题。您每次通过循环都要重新初始化生成器。因为您没有提供种子,默认构造函数使用当前时间精确到毫秒作为种子。因为您的循环运行得非常快,这个数字对于您的循环的大多数迭代都是相同的,因此您会生成相同的nu分子量重复
解决方案:
将其移出循环=)
进一步阅读:
这是您的问题。您每次通过循环都要重新初始化生成器。因为您没有提供种子,默认构造函数使用当前时间精确到毫秒作为种子。因为您的循环运行得非常快,这个数字对于您的循环的大多数迭代都是相同的,因此您会生成相同的nu分子量重复
解决方案:
将其移出循环=)
进一步阅读:在循环外部实例化随机数生成器,使其能够正确生成随机数
这是因为种子主要基于cpu时钟。请记住,计算机只能生成“伪随机”数。为了做到这一点,他们使用种子和一些数学。如果使用的种子来自同一时间(因为循环中的代码以纳秒为单位执行),则每个随机数都是相同的
在循环外部使用时,种子将为每次调用一个随机数时创建不同的随机数提供基础。在循环外部实例化随机数生成器,使其能够正确生成随机数
这是因为种子主要基于cpu时钟。请记住,计算机只能生成“伪随机”数。为了做到这一点,他们使用种子和一些数学。如果使用的种子来自同一时间(因为循环中的代码以纳秒为单位执行),则每个随机数都是相同的
当在循环外部使用时,种子将为每次调用一个随机数时创建不同的随机数提供基础。你说的是什么意思给它一个稍微随机的种子
?要生成一个随机数,您需要给出一个随机种子?有趣的Random实际上是一个返回看似随机的数字的函数。然而它仍然只是一个函数。所以每次你从相同的种子值开始,你都会从中得到相同的“随机”数串。我已经知道了,但是要得到一个随机数,你需要一个随机种子吗?那么你将如何产生种子呢?另一个随机类有一个随机种子?@SriramSakthivel通常你会根据时间使用一些东西。在本例中,使用默认构造函数的Random()使用一个时间相关的种子值。我也知道,IIRC它使用Environment.TickCount
。你的观点是什么?你说的是什么意思?给它一个随机的种子?要生成一个随机数,您需要给出一个随机种子?有趣的Random实际上是一个返回看似随机的数字的函数。然而它仍然只是一个函数。所以每次你从相同的种子值开始,你都会从中得到相同的“随机”数串。我已经知道了,但是要得到一个随机数,你需要一个随机种子吗?那么你将如何产生种子呢?另一个随机类有一个随机种子?@SriramSakthivel通常你会根据时间使用一些东西。在本例中,使用默认的con
Random rnd = new Random();
for (int x = 1; x <= 25; x++)
{
int flip = rnd.Next(1, 3);
//do stuff
}
Random rnd = new Random();