1

如果我在 c# 中运行此代码,生成的输出是两个随机字符串,每次执行都会更改。但是 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”。

这不是“Hello World”,因为 .NET 中的随机数生成器不使用与 Java 中相同的算法,但在这两种情况下,您每次都从相同的种子开始,因此您得到相同的序列的随机数。恰好选择了这些种子,以便在 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 回答