当c#生成随机输出时,为什么Java生成"Hello World"对于同一段代码

本文关键字:quot 于同一 World Hello 段代码 代码 输出 随机 为什么 生成 Java | 更新日期: 2023-09-27 18:02:35

如果我在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();
}

当c#生成随机输出时,为什么Java生成"Hello World"对于同一段代码

不,. net版本总是给出相同的输出"terkcq onbmmjujsrb"。

它不是"Hello World"因为。net中的随机数生成器与Java中的随机数生成器使用的算法不同,但在这两种情况下,每次都从相同的种子开始,因此得到的是相同的随机数序列。在Java中,碰巧选择了这样的种子,最终得到"Hello world"。可能是在。net中给出相同结果的种子(当然可能会弄乱Java输出)。

取自。net Random构造函数的文档:

为不同的Random对象提供相同的种子值会导致每个实例产生相同的随机数序列。

如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。

(无可否认,没有文档记录该算法是否在所有。net版本中保持稳定)

它依赖于java.util.Random使用特定的算法并以特定的方式使用种子,这显然是c#没有共享的