2016-06-10 89 views
1
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”在第二个构造函数中会这样做,但我不确定这是否正确。如何在java中生成两次相同的随机序列?

+1

什么是SingleRandom? –

+1

你的意思是使用相同的**随机种子**吗? –

+2

通常你使用相同的种子。 –

回答

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

我不确定我的代码是否正确 - 我不是Java,而是C#开发人员。请让我知道,如果有任何错误:) –

0

我不知道你是怎么生成随机数,什么SingleRandom对象是
但在Java中有一个Random类=>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)
作品以这样一种方式:

它改变了这个随机数字发生器对象的状态,以便 处于完全相同的状态,就好像刚刚使用 参数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 
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()用硬编码值,你会确保它遵循在每次运行相同的序列。

+0

是的!这正是我的班级看起来的样子,这似乎是正确的。 – student

相关问题