簡體   English   中英

HashSet中的隨機數始終相同

[英]Always the same random numbers in 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

文檔中

此類的實例用於生成偽隨機數流。 該類使用48位種子,可以使用線性同余公式對其進行修改。 (請參見Donald Knuth,計算機編程藝術,第3卷,第3.2.1節)。

如果使用相同的種子創建兩個Random實例,並且對每個實例進行相同的方法調用序列,則它們將生成並返回相同的數字序列。

Math.random返回一個double,Random接收一個long作為其種子。 因此,您可能每次都會獲得0作為種子。 嘗試更改為System.getNanoTime()只是為了進行測試,看看會發生什么。

關於您的代碼,當使用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));
    }

我的意思是,無論隨機數是多少,此代碼都會導致獲得相同的數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM