繁体   English   中英

如何在Java中两次生成相同的随机序列?

[英]How to generate the same random sequence twice in java?

public class MazeBuilder implements Runnable {

    // class internal local variables
    protected SingleRandom random ; // random number stream, used to make randomized decisions, e.g for direction to go
    Order order; // describes what is wanted, e.g. a perfect maze or not    
    /**
     * Constructor for a randomized maze generation
     */
    public MazeBuilder(){
        random = SingleRandom.getRandom();
    }
    /**
     * Constructor with option to make maze generation deterministic or random
     */
    public MazeBuilder(boolean deterministic){
        if (true == deterministic)
        {
            this.random = random ;
        }


    random = SingleRandom.getRandom();
}

第一个构造函数随机生成一个迷宫。 我需要实现代码,以便如果两次针对相同的技能水平调用MazeBuilder.build,它将提供相同的结果。 我认为“ this.random = random;” 在第二个构造函数中将执行此操作,但是我不确定这是正确的。

您想要实现的实际上称为随机种子 如果使用相同的种子初始化Random ,则每次都会获得相同的序列。

在WikipediaStackOverflow上了解有关什么是随机种子的更多信息。

您可以简单地执行以下操作:

public class MazeBuilder
{
    private Random _random;

    public MazeBuilder()
    {
        _random = new Random();
    }

    public MazeBuilder(int seed)
    {
        _random = new Random(seed);
    }

    public void generateMaze()
    {
        // here you use _random.next()
    }
}

如果您使用的是此类或类似的类,请尝试以下操作:

private static final int SEED = 1234; // or any other int

/**
 * Constructor with option to make maze generation deterministic or random
 */
public MazeBuilder(boolean deterministic) {
    random = SingleRandom.getRandom();
    if (deterministic) {
        random.setSeed(SEED);
    }
}

通过使用硬编码值调用setSeed() ,可以确保每次运行都遵循相同的顺序。

我不知道您如何生成随机数以及什么是SingleRandom对象
但是在Java中有一个Random类=> https://docs.oracle.com/javase/7/docs/api/java/util/Random.html
其中的setSeed方法: https : setSeed
以以下方式工作:

它会更改此随机数生成器对象的状态,使其处于与刚刚使用参数seed作为种子创建的状态完全相同的状态。

下面的代码使用setSeed重置random对象,并以此方式生成两次相同的随机数流:

 Random rand = new Random();

  rand.setSeed(3);
  for( int i = 1; i <= 10; i++){
      System.out.println( rand.nextInt());
  }

  System.out.println( "=============");

  rand.setSeed(3);
  for( int i = 1; i <= 10; i++){
      System.out.println( rand.nextInt());
  }

-1155099828
-1879439976
304908421
-836442134
288278256
-1795872892
-995758198
-1824734168
976394918
-634239373
=============
-1155099828
-1879439976
304908421
-836442134
288278256
-1795872892
-995758198
-1824734168
976394918
-634239373

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM