[英]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.