C# 随机数生成循环生成相同的数

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 <

我对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 <= 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();