//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 :(得分:4)
尝试将Random rnd = new Random();
移到while循环之外:
Random rnd = new Random();
while (count < 1000)
//...
问题是计算机中没有 true 随机数;它们都是先前生成的随机数列表。由于您在每个循环中实例化Random
,因此您基本上每次都选择相同的起始种子。通过仅使用在循环外部创建的Random
的一个实例,您的应用程序将真正表现为数字是随机生成的。
编辑:为了回应Solal Pirelli在评论中所说的,Random
的实例实际上是使用当前计算机系统的时间播种(如果你不给它任何种子构造函数中的值);但是,由于循环迭代发生的速度非常快,因此为每个循环迭代创建的每个实例都具有相同的种子。
编辑#2:正如CalebB所指出的,通过其他构造函数向您的Random
实例提供自己的种子也是一种很好的做法。我建议使用GUID中的哈希值:
Random rnd = new Random(Guid.NewGuid().GetHashCode());
此本质上保证Random
的每个实例始终以不同方式播种,即使您快速连续创建新实例也是如此。我说 essientially 因为,虽然统计上非常低的概率, 有两个GUID值可能相同的机会。
答案 1 :(得分:0)
固定! :
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();
}
}
}