0

繰り返しになりますが、ここで助けが必要です。今日は、2 つのサイコロの結果を合計できるメソッドを作成することからなる ac# の宿題をしていました。 、コードを実行すると、本当に奇妙なことが起こります。コードと結果が自分自身から話すようにします。

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


-ロール1は完璧です

-ロール2/サイコロ1...パーフェクト、

-ロール 2/ダイス 2... WTH ???

これらの結果は本当に奇妙です。ロールごとに異なるタイムスタンプと異なる値を取得することを期待していました。それらの数字が生成された時間を確認するために私が思いついたタイムスタンプのようなもので、両方の「サイコロ」が同時に転がされているように見え、「ランダム」がクロックを使用してシードを生成しているように見えます。

DiceRoll() メソッドを使用してサイコロのクラス全体を作成しようとさえしましたが、完全に異なるオブジェクトの両方が同じ結果を何度も得ていました..

どうすればこれを修正できますか?、何かアイデアはありますか?

4

2 に答える 2

4

Randomは、既定のコンストラクターと共に使用すると、時間をシードとして使用します。同じシードを使用すると、毎回同じ結果が得られます。新しいRandomを連続して数回作成しているため、それぞれが同じシードで開始されるため、同じ数値が生成されます。この問題を解決するには、1 つだけ作成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 に答える