C# C中的简单正面/反面#

C# C中的简单正面/反面#,c#,loops,random,while-loop,C#,Loops,Random,While Loop,读了一些C#教程后,我决定做一个正面/反面的小游戏。它生成一个随机数0或1,并写出结果。用一个循环,我重复了一千次。问题是,它只会根据生成的0或1是否更多而写“head”或“tails”。例如,如果有535个“0”和465个“1”,它只会写下“头”。这是我的密码: //variables int count = 0; int tails = 0; int heads = 0; while(count < 1000) { Random rnd = new Random();

读了一些C#教程后,我决定做一个正面/反面的小游戏。它生成一个随机数0或1,并写出结果。用一个循环,我重复了一千次。问题是,它只会根据生成的0或1是否更多而写“head”或“tails”。例如,如果有535个“0”和465个“1”,它只会写下“头”。这是我的密码:

//variables
int count = 0;
int tails = 0;
int heads = 0;

while(count < 1000)
{
    Random rnd = new Random();
    int result = rnd.Next(0,2);
    if(result == 1)
    {
        Console.WriteLine("Tails!");
        tails = tails + 1;
        count = count + 1;

    }
    else if(result == 0)
    {
        Console.WriteLine("Heads!");
        heads = heads + 1;
        count = count + 1;
    }
}
Console.WriteLine("Heads = " + heads + "Tails = " + tails + " Counts = " + count);
Console.ReadLine();
//变量
整数计数=0;
int-tails=0;
int头=0;
同时(计数<1000)
{
随机rnd=新随机();
int result=rnd.Next(0,2);
如果(结果==1)
{
控制台。写线(“尾巴!”);
尾部=尾部+1;
计数=计数+1;
}
否则如果(结果==0)
{
控制台。写线(“头!”);
头部=头部+1;
计数=计数+1;
}
}
Console.WriteLine(“Heads=“+Heads+”Tails=“+Tails+”Counts=“+count”);
Console.ReadLine();

尝试移动
Random rnd=new Random()在while循环之外:

Random rnd = new Random();

while (count < 1000)
//...

这从本质上保证了
Random
的每个实例的种子总是不同的,即使您快速连续地创建新实例也是如此。我之所以这么说,主要是因为,虽然统计上概率非常低,但两个GUID值可能是相同的。

尝试移动
Random rnd=new Random()在while循环之外:

Random rnd = new Random();

while (count < 1000)
//...
这从本质上保证了
Random
的每个实例的种子总是不同的,即使您快速连续地创建新实例也是如此。我之所以这么说,主要是因为,虽然统计上的概率非常低,但两个GUID值可能是相同的。

固定的!:

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(string[] args)
        {
            Random rand = new Random();
            Console.WriteLine(String.Join("\n",Enumerable.Repeat(0, 1000).Select(i => rand.Next(0,2) == 1 ? "Tails" : "Heads").GroupBy(i=>i).Select(g=> g.Key + " " + g.Count())));
            Console.ReadLine();
        }
    }
}
修正!:

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(string[] args)
        {
            Random rand = new Random();
            Console.WriteLine(String.Join("\n",Enumerable.Repeat(0, 1000).Select(i => rand.Next(0,2) == 1 ? "Tails" : "Heads").GroupBy(i=>i).Select(g=> g.Key + " " + g.Count())));
            Console.ReadLine();
        }
    }
}

不要在循环中创建新的Random()。在方法开始时创建一次,并在while循环中调用rnd.Next()。还有另一个重复的为什么要进行下一次投票?这是一个真正的问题,当然是在主题上……@cullub单在这个网站上就可能有20多个副本。对我来说,听起来很像“没有任何研究成果”。这是真的。然而,问题的本质似乎表明他走错了路——他认为这与每个循环的数量有关。不要在循环中创建新的Random()。在方法开始时创建一次,并在while循环中调用rnd.Next()。还有另一个重复的为什么要进行下一次投票?这是一个真正的问题,当然是在主题上……@cullub单在这个网站上就可能有20多个副本。对我来说,听起来很像“没有任何研究成果”。这是真的。然而,问题的本质似乎表明他走错了路——他认为这与每个人的数量有关。更准确地说,
Random
是默认情况下与当前系统时间一起播种的。由于简单循环的迭代速度非常快,因此该循环中的所有
Random
实例将具有相同的种子。此外,向随机实例添加种子不会有任何影响:
Random rnd=new Random(“生成随机数的整数种子”)
可能根据一年中的某一天的时间或任何动态值进行计算。更准确地说,
Random
默认使用当前系统时间作为种子。由于简单循环的迭代速度非常快,因此该循环中的所有
Random
实例将具有相同的种子。此外,向随机实例添加种子不会有任何影响:
Random rnd=new Random(“生成随机数的整数种子”)可能基于一年中的某一天与某一天的时间或任何动态值。