1

このコードを C# で実行すると、生成される出力は、実行ごとに変化する 2 つのランダムな文字列です。しかし、Java コードは常に「Hello World」を出力します。

 static void Main(string[] args)
        {
           Console.WriteLine(randomString(-229985452) + " " + randomString(-147909649));
           Console.ReadLine();
        }
        public static String randomString(int i)
        {
            Random ran = new Random(i);
            StringBuilder sb = new StringBuilder();
            for (int n = 0; ; n++)
            {
                int k = ran.Next(27);
                if (k == 0)
                    break;

                sb.Append((char)('`' + k));

            }

            return sb.ToString();
        }

しかし、Java の同じコードは 'Hello World' を出力します。これらの言語の動作が異なるのはなぜですか?

Java コード

System.out.println(randomString(-229985452) + " " + randomString(-147909649));

その方法

public static String randomString(int i)
{
    Random ran = new Random(i);
    StringBuilder sb = new StringBuilder();
    for (int n = 0; ; n++)
    {
        int k = ran.nextInt(27);
        if (k == 0)
            break;

        sb.append((char)('`' + k));
    }

    return sb.toString();
}
4

2 に答える 2

14

いいえ、.NET バージョンでは常に同じ出力が得られます - 「terkcq onbmmjujsrb」。

.NET の乱数ジェネレーターは Java の乱数ジェネレーターと同じアルゴリズムを使用しないため、「Hello World」ではありませんが、どちらの場合も毎回同じシードから開始するため、同じシーケンスが得られます。乱数の。シードはたまたま Java で「Hello World」になるように選択されます。.NET で同じ結果が得られるシードが存在する可能性があります (もちろん、Java の出力を台無しにしている可能性があります)。

シードを取得する.NETRandomコンストラクターのドキュメントから:

異なる Random オブジェクトに同一のシード値を指定すると、各インスタンスは同一の乱数列を生成します。

アプリケーションで異なる乱数シーケンスが必要な場合は、このコンストラクターを異なるシード値で繰り返し呼び出します。

(確かに、.NET のすべてのバージョンでアルゴリズムが安定しているかどうかは文書化されていません。)

于 2013-03-07T06:19:09.313 に答える
0

これは、特定のアルゴリズムを使用し、特定の方法でシードを使用する java.util.Random に依存していますが、これは明らかに C# では共有されません。

于 2013-03-07T06:20:06.493 に答える