0

再次,我在这里需要一些帮助,今天我正在做 ac# 作业,基本上包括创建一个可以总结 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();
        }
    }
}

现在,这就是我运行它时得到的:

掷骰子 #1

骰子 1:1 / 时间戳:201308260146259075

骰子 2:2 / 时间戳:201308260146259131

骰子总和:3


掷骰子 #2

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


掷骰子#3

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


骰子#4

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


骰子 #5

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


掷骰子 #6

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


掷骰子 #7

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


掷骰子 #8

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


骰子 #9

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


骰子 #10

骰子 1:2 / 时间戳:201308260146259135

骰子 2:5 / 时间戳:201308260146259135

骰子总和:7


-Roll 1 是完美的

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

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

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

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

我该如何解决这个问题?有什么想法吗?

4

2 回答 2

4

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

此外,您可能很清楚这一点,但由于这是一个常见错误,而且大多数骰子掷骰都是从 1-6 开始的,我觉得我应该指出Random.Next使用和独占上限,所以目前您只能从 1- 中获得数字5.

于 2013-08-26T16:21:41.353 回答
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();
        }
    }
}

几个卷的时间戳可以是相同的,但对于那些是战略的那么多则不是

于 2013-08-26T16:26:56.650 回答