Random()总是使用种子选择相同的数字

时间:2015-08-27 21:12:57

标签: java loops random random-seed

我有一个非常奇怪的错误,我正在尝试修复。我会尽力解释它。

我有一个班级,在那个班级我有一个方法可以选择一个随机数。 每次运行应用程序时,随机数生成必须生成完全相同的数字序列(不同的数字,但无论何时运行应用程序,都以相同的顺序出现)。

因此我需要使用种子。

我的代码看起来像这样:

    public class Tree{
    Random rand = new Random(12345);

///...code...///

         public Tree randomNode() {

              //HERE IS THE ERROR
              int r = rand.nextInt(this.size);

              if (r == 0) {
                 return this;

              } 
              else if (left != null && 1 <= r && r <= left.size) {
                 return left.randomNode();
              } 
              else {
                 return right.randomNode();
              }
           }
        }

我有一个使用它的帮助器类,看起来有点像这样:

   public Crossover(Tree p1, Tree p2)
   {
      Tree subtreeP1 = p1.randomNode();
      Tree subtreeP2 = p2.randomNode();
   }

我的主要方法看起来有点像这样:

for(i=0;i<cross;i++)
{
Crossover c = new Crossover(p1,p2);
}

在main方法的第一个循环中,r的数字随机生成并且很好。但是,在第二个循环(以及后面的所有循环)是我遇到问题的地方。 问题在于int r = rand.nextInt(this.size);行 - 在第二次循环之后,无论怎样,我总是得到0。

如果我删除种子,一切正常。如果我包含种子,我会在第一次循环后开始逐渐变为0。

如何继续使用种子,但获取随机数?我做错了什么?

**编辑:**

this.size指的是我树的大小。我确保r为0时,它不为零。 另外我想指出的是,当我简单地删除数字种子时,它工作正常,随机数生成工作正常。当我添加种子时,我遇到了问题。

编辑#2 好的,按照要求,我已经整理了一个说明我问题的小程序。按原样运行它。一次与种子一次,没有。

import java.util.*;
public class Problem{

   public static void main(String args[])
   {
      for(int i=0; i<100; i++)
      {
         Clas c1 = new Clas();
         Helper h = new Helper(c1);
         System.out.println(h.getR());
      }
   }
}
class Helper
{
   int r;
   Helper(Clas c)
   {
      r = c.method();
   }
   public int getR()
   {
      return r;
   }      
}
class Clas
{

   Random rand = new Random(1825897);
   Clas()
   {
   }
   public int method()
   {
      int r = rand.nextInt(10); 
      return r;
   }

}

2 个答案:

答案 0 :(得分:2)

在循环中,您不想重置随机数生成器,我假设?

在示例中,您可以执行以下操作:

 Clas c1 = new Clas();
 for(int i=0; i<100; i++)
 {
     Helper h = new Helper(c1);
     System.out.println(h.getR());
 }

在原始示例中,您似乎有多个Tree实例,因此您无法使用它。但是你可以声明你的随机静态,所以它在所有树之间共享:

static Random rand = new Random(1825897);

答案 1 :(得分:-2)

尝试使用函数 android:background="@drawable/circular_progress_bar_background" 生成随机数。 Math.random()生成0到1之间的随机数。