C# C中的简单正面/反面#
读了一些C#教程后,我决定做一个正面/反面的小游戏。它生成一个随机数0或1,并写出结果。用一个循环,我重复了一千次。问题是,它只会根据生成的0或1是否更多而写“head”或“tails”。例如,如果有535个“0”和465个“1”,它只会写下“头”。这是我的密码: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();
//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(“生成随机数的整数种子”)代码>可能基于一年中的某一天与某一天的时间或任何动态值。