HashSet中始终使用相同的随机数

时间:2013-12-09 15:28:23

标签: java random hashset

我有以下课程:

public class MyClass
{
    private Random rand;
    private HashSet<Pair<Integer, Integer>> set;

    public MyClass()
    {
       rand = new Random(Double.doubleToLongBits(Math.random()));
       set = new HashSet<Pair<Integer, Integer>>();
    }


    public void doSomething(int len)
    {   
        set.clear();

        for (int i = 0; i < 1000; i++)
        {
            int index = rand.nextInt(len - 1) + 1;

            int min = 1 - index;
            int max = len - index - 1;
            int j = rand.nextInt(max - min + 1) + min;

            if (j != 0)
            {   
               set.add(new Pair<Integer, Integer>(index, j));
            }
        }
    }
}

Pair是一个自定义类,我可以存储两个整数。问题在于,每次拨打doSomething()时,HashSet都包含相同的值。

怎么可能?我该如何解决这个问题?

修改

这是我的配对:https://stackoverflow.com/a/677248/1395740

3 个答案:

答案 0 :(得分:0)

来自documentation

  

此类的实例用于生成流的   伪随机数。该类使用48位种子,该种子经过修改   使用线性同余公式。 (见唐纳德克努特,艺术   计算机编程,第3卷,第3.2.1节。)

     

如果使用相同的种子创建了两个Random实例,那么   为每个方法调用相同的方法调用,它们将生成和   返回相同的数字序列。

答案 1 :(得分:0)

Math.random返回一个double,Random接收一个long作为其种子。所以你每次都可能得到0作为种子。尝试更改为System.getNanoTime()只是为了测试,看看会发生什么。

答案 2 :(得分:0)

关于你的代码,当用5作为len参数运行它时,结果如下: [(4,-2),(4,-1),(4,-3),(2,-1),(3,-1),(3,-2),(1,1),( 2,1),(1,2),(3,1),(2,2),(1,3)] [(4,-2),(3,-1),(4,-1),(4,-3),(3,-2),(2,-1),(1,1),( 2,1),(1,2),(3,1),(2,2),(1,3)]

如果你追踪你的代码,它不是同一对,每次doSomething方法生成新的随机数,但在循环中,所有导致j!= 0的数字都将被忽略,所以你将拥有那些对,

此代码中的问题

    int index = rand.nextInt(len - 1) + 1;
    int min = 1 - index;
    int max = len - index - 1;
    int j = rand.nextInt(max - min + 1) + min;

    if (j != 0)
    {   
       set.add(new Pair<Integer, Integer>(index, j));
    }

我的意思是,无论随机数是多少,这段代码都会得到相同的数字。