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

时间:2016-06-10 03:48:28

标签: java random

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;"在第二个构造函数中将执行此操作,但我不确定这是否正确。

3 个答案:

答案 0 :(得分:1)

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

详细了解随机种子at Wikipediaat StackOverflow

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

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()
    }
}

答案 1 :(得分:1)

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

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(),您将确保在每次运行时遵循相同的顺序。

答案 2 :(得分:0)

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

  

它改变了这个随机数生成器对象的状态   处于完全相同的状态,好像刚刚用它创建的那样   论种子作为种子。

以下代码使用random重置setSeed个对象,并以这种方式生成两倍于相同的随机数流:

 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