为啥使用带有硬编码种子的 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 总是产生相同的结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Random.nextBoolean() 无论种子如何,总是返回 True

java中Random随机种子使用

JavaSE8基础 Random 使用给定的种子产生随机数

java产生随机数我怎么固定长度???

JAVA:Random函数及其种子的作用

Java学习:Random类