C#中简单的头/尾

时间:2015-04-17 14:57:21

标签: c# loops random while-loop

在阅读了一些C#教程之后,我决定制作一个头/尾的迷你游戏。它生成一个0或1的随机数,并写出结果。使用循环我重复这一千次。问题是它只会写“头”或“尾”,这取决于0或1是否产生更多。例如,如果有535“0”和465“1”,它只会写下“Heads”。这是我的代码:

//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();

2 个答案:

答案 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();
        }
    }
}