2017-05-25 90 views
1

我想用它來生成10個具有隨機價格和容量的Udisk實例。帶有隨機種子的Java TreeMap沒有固定大小

// test.java 
import java.util.*; 

class Udisk { 
    float price; 
    int capacity; 
    Udisk(float p, int c) { 
     this.price = p; 
     this.capacity = c; 
    } 
    @Override 
    public String toString() { 
     return "Udisk price: "+this.price+" capacity: "+this.capacity; 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     Map<Float, Udisk> tm = new TreeMap<Float, Udisk>(); 
     for(int count=0; count < 10; count++) { 
      Random rand = new Random(System.currentTimeMillis()); 
      float price = Math.abs(rand.nextInt())%100; 
      int capacity = Math.abs(rand.nextInt())%10; 
      Udisk u = new Udisk(price, capacity); 
      tm.put(u.price, u); 
     } 
     System.out.println(tm+ " "+tm.size()); 
    } 
} 

javac test.java後,我跑了java Main多次,結果就是這麼奇怪

First Time: {3.0=Udisk price: 3.0 capacity: 1} 1 
Second Time: {33.0=Udisk price: 33.0 capacity: 8, 86.0=Udisk price: 86.0 capacity: 0} 2 
Third Time: {46.0=Udisk price: 46.0 capacity: 8} 1 
Fourth Time: {24.0=Udisk price: 24.0 capacity: 1, 73.0=Udisk price: 73.0 capacity: 5} 2 

所有這些結果具有樹形圖少於10項。代碼更改爲

import java.util.*; 

class Udisk { 
    float price; 
    int capacity; 
    Udisk(float p, int c) { 
     this.price = p; 
     this.capacity = c; 
    } 
    @Override 
    public String toString() { 
     return "Udisk price: "+this.price+" capacity: "+this.capacity; 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     Map<Float, Udisk> tm = new TreeMap<Float, Udisk>(); 
     for(int count=0; count < 10; count++) { 
      Random rand = new Random(System.currentTimeMillis()); 
      float price = Math.abs(count)%100; 
      int capacity = Math.abs(count)%10; 
      Udisk u = new Udisk(price, capacity); 
      tm.put(u.price, u); 
     } 
     System.out.println(tm+ " "+tm.size()); 
    } 
} 

後的答案是正確的

{0.0=Udisk price: 0.0 capacity: 0, 1.0=Udisk price: 1.0 capacity: 1, 
2.0=Udisk price: 2.0 capacity: 2, 3.0=Udisk price: 3.0 capacity: 3, 
4.0=Udisk price: 4.0 capacity: 4, 5.0=Udisk price: 5.0 capacity: 5, 
6.0=Udisk price: 6.0 capacity: 6, 7.0=Udisk price: 7.0 capacity: 7, 
8.0=Udisk price: 8.0 capacity: 8, 9.0=Udisk price: 9.0 capacity: 9} 10 

我不知道我是怎麼錯過了隨機導致前者的問題,感謝您的幫助!

回答

1

這方面的一些想法:

一)初始化隨機環內是昂貴的 - 你總是初始化一個新的隨機僞隨機數序列,而你也可以同樣拉隨機創造出循環和做

b)你們的價格整數模100 - >只有100可能的值,所以你可能會想到鍵衝突(在這種情況下,10次迭代不會產生10種不同元素)

,最重要的

c)System.currentTimeMillis()可能太慢了。你的循環只創建一個對象並將其放入地圖 - 這非常非常快(即使是隨機播種)。 這可能是因爲System.currentTimeMillis()在迭代之間沒有變化(並且您總是重新種子),您可能最終只需初始化具有相同種子值的僞隨機序列!)。相同種子的蘭德姆生成相同的序列。因此,除非您的System.currentTimeMillis()在迭代之間改變(並且在某些系統上這種情況只發生在每個〜15ms內),否則您最終只會得到一個或最多兩個不同的價格值。

嘗試拉動隨機跳出循環:

Random rand = new Random(System.currentTimeMillis()); 
    for(int count=0; count < 10; count++) { 
     float price = Math.abs(rand.nextInt())%100; 
     int capacity = Math.abs(rand.nextInt())%10; 
     Udisk u = new Udisk(price, capacity); 
     tm.put(u.price, u); 
    } 

現在你應該更接近10倍的值。不過你可能會不吉利,並得出一致nextInt()值的兩倍 - 如果你需要究竟 10個值我建議作出的循環條件:

Random rand = new Random(System.currentTimeMillis()); 
    while(tm.size() < 10) { 
     float price = Math.abs(rand.nextInt())%100; 
     int capacity = Math.abs(rand.nextInt())%10; 
     Udisk u = new Udisk(price, capacity); 
     tm.put(u.price, u); 
    } 

好運。

+0

非常感謝!這有助於很多:) –

+0

隨時接受爲答覆/ upvote :-) – Jan