为啥使用带有硬编码种子的 Random 总是产生相同的结果? [复制]
Posted
技术标签:
【中文标题】为啥使用带有硬编码种子的 Random 总是产生相同的结果? [复制]【英文标题】:Why does the use of Random with a hardcoded seed always produce the same results? [duplicate]为什么使用带有硬编码种子的 Random 总是产生相同的结果? [复制] 【发布时间】:2011-12-24 01:55:15 【问题描述】:以下 Java 简单程序使用 java.util.Random
类,因此它始终显示“hello world”。代码sn-p如下所示。
package nomain;
import java.util.Random;
final public class J
public static String randomString(int seed)
Random rand = new Random(seed);
StringBuilder sb = new StringBuilder();
for(int i=0;;i++)
int n=rand.nextInt(27);
if (n==0)
break;
sb.append((char) ('`'+n));
return sb.toString();
public static void main(String args[])
System.out.println(randomString(-229985452)+' '+randomString(-147909649));
令人惊讶的是,即使使用了导致随机数生成的 Random 类,它也始终显示“hello world”,因此,每次运行时都应更改数字并相应更改相应的字符,但它总是只显示一个稳定的字符串,就是上面提到的“hello world”。为什么会这样?
【问题讨论】:
这可能与随机数生成器是确定性的事实有关...意思是,如果使用相同的种子值,则每次都会生成相同的序列。但我并不积极。 这个问题不是那个问题的重复。这个问题是这个问题的重复。 【参考方案1】:答案是传入的参数。它用于播种随机数生成器。
Random rand = new Random(seed);
PRNG 并不是真正随机的 - 它们是确定性的,但旨在模拟随机性。出于这个原因,它们被更好地称为“伪随机数生成器”。
对于给定的种子,PRNG 将始终生成相同的数字。然后它可能会使用其最后一个结果作为下一个值的输入,因此通过使用已知值播种 PRNG,您将始终生成一个已知的“随机”数字序列。
已知数字 -229985452 和 -147909649 是种子,它们会导致特定的 PRNG 生成一个由 5 个数字组成的序列,这些数字可以解释为“hello”和“world”。如果您要更改这些数字,您会得到不同的 5 个字符序列,但对于程序的每次运行,它们都是相同的,只要种子保持不变。
【讨论】:
以上是关于为啥使用带有硬编码种子的 Random 总是产生相同的结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章