随机的奇怪“随机”行为

时间:2013-08-26 16:19:48

标签: c# datetime random timestamp

再次,我需要一些帮助,今天我做的是#homework,主要是创建一个方法,可以总结2个骰子卷的结果,到目前为止,这么好!,没有难的事情要做。 ..但是,当我运行我的代码时,一些非常奇怪的事情发生了,我会让我的代码和结果自己说话:

using System;

class Program
{

    public static String GetTimestamp()
    {
        DateTime saveNow = DateTime.Now;
        return saveNow.ToString("yyyyMMddHHmmssffff");
    }

    public static int ThrowDice()
    {
        int randVal1, randVal2;
        string TS1, TS2;

        Random rand = new Random();
        randVal1 = rand.Next(1,6);
        TS1 = GetTimestamp();
        randVal2 = rand.Next(1,6);
        TS2 = GetTimestamp();

        Console.WriteLine("Dice 1: \t" + randVal1 + ' ' + TS1);
        Console.WriteLine("Dice 2: \t" + randVal2 + ' ' + TS2);
        Console.WriteLine("-----------------");

        return randVal1 + randVal2;
    }

    static void Main()
    {
        for(int i = 1; i<=10;i++)
        {
            Console.WriteLine("Dice Roll #" + i);
            Console.WriteLine("Dice Sum:\t" + ThrowDice());
            Console.WriteLine();
        }
    }
}

现在,这就是我运行时的结果:

Dice Roll#1

骰子1:1 / TimeStamp:201308260146259075

骰子2:2 / TimeStamp:201308260146259131

骰子总数:3


Dice Roll#2

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#3

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#4

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#5

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#6

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#7

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#8

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#9

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


Dice Roll#10

骰子1:2 / TimeStamp:201308260146259135

骰子2:5 / TimeStamp:201308260146259135

骰子总数:7


-Roll 1是完美的

-Roll 2 /骰子1 ...完美,

-Roll 2 /骰子2 ...... WTH ???

这些结果真的很奇怪,我期望在每个卷上获得不同的时间戳和不同的值。 timeStamp是什么想法我想出来检查生成这些数字的时间,看起来两个“骰子”同时滚动,看起来像“随机”使用时钟生成种子。

我甚至尝试使用DiceRoll()方法为骰子创建一个完整的类,但即使在那里,两个完全不同的对象我只是一遍又一遍地得到相同的结果..

我如何解决这个问题?,任何想法?

2 个答案:

答案 0 :(得分:4)

Random与默认构造函数一起使用时,将时间用作种子。使用相同的种子,您每次都会得到相同的结果。由于您连续多次创建新的Random,因此每个都将以相同的种子开始,因此生成相同的数字。要解决此问题,请只使用一个Random并重复使用。

另外,你可能知道这一点,但由于这是一个常见的错误,并且大多数骰子都来自1-6,我觉得我应该指出Random.Next使用和独占上限,所以目前你只得到1-5的数字。

答案 1 :(得分:0)

Rand 声明为静态变量,并将其初始化为

using System;

class Program
{

    public static String GetTimestamp()
    {
        DateTime saveNow = DateTime.Now;
        return saveNow.ToString("yyyyMMddHHmmssffff");
    }

    public static int ThrowDice()
    {
        int randVal1, randVal2;
        string TS1, TS2;


        randVal1 = rand.Next(1,7);
        TS1 = GetTimestamp();
        randVal2 = rand.Next(1,7);
        TS2 = GetTimestamp();

        Console.WriteLine("Dice 1: \t" + randVal1 + ' ' + TS1);
        Console.WriteLine("Dice 2: \t" + randVal2 + ' ' + TS2);
        Console.WriteLine("-----------------");

        return randVal1 + randVal2;
    }
    static Random rand ;

    static void Main()
    {
        rand = new Random();

        for(int i = 1; i<=10;i++)
        {
            Console.WriteLine("Dice Roll #" + i);
            Console.WriteLine("Dice Sum:\t" + ThrowDice());
            Console.WriteLine();
        }
    }
}

时间戳对于几个卷而言可以是相同的,但不是那么多奇怪的