当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();
}
不,. net版本总是给出相同的输出"terkcq onbmmjujsrb"。
它不是"Hello World"因为。net中的随机数生成器与Java中的随机数生成器使用的算法不同,但在这两种情况下,每次都从相同的种子开始,因此得到的是相同的随机数序列。在Java中,碰巧选择了这样的种子,最终得到"Hello world"。可能是在。net中给出相同结果的种子(当然可能会弄乱Java输出)。
取自。net Random
构造函数的文档:
为不同的Random对象提供相同的种子值会导致每个实例产生相同的随机数序列。
如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。
(无可否认,没有文档记录该算法是否在所有。net版本中保持稳定)
它依赖于java.util.Random使用特定的算法并以特定的方式使用种子,这显然是c#没有共享的