2011-04-06 140 views
0
Hashtable values = new Hashtable(); 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Random r = new Random(); 
    int newval = r.Next(10); 

    values.Add("key",newval); 


    //foreach (object value in values.Values) 
    //{ 
    // Response.Write(value.ToString()); 
    //} 


    ArrayList arrayList = new ArrayList(values.Values); 
    foreach (int key in arrayList) 
    { 
     Response.Write(key); 
    } 
} 
+2

而問題是... – 2011-04-06 14:53:18

+0

我想你的問題「當生成一個隨機的整數集合時,我該如何確保我沒有任何重複的數字?那是對的嗎? – asawyer 2011-04-06 14:54:09

+0

你想避免重複的鍵或值?您何時想避開它們 - 何時添加到Hashtable中,或者何時從ArrayList中寫出它們? – JohnK813 2011-04-06 14:55:16

回答

0

這是隨機的。根據定義,存在統計數字會重複的可能性。您可以將1-10個隨機整數添加到列表中,並且不會重複,但這不太可能。

理想情況下,每次調用隨機函數時,獲得任意一個數字的機率與獲取其他數字的機率完全相同,包括上次得到的數字。

0

如果你不想值重複 - 你可以將其添加到查看新的值包含在當前設置值之前執行檢查(如果這是你所要求

如果你想避免增加在重複的值 - 到值,你可以這樣做:

Random r = new Random(); 
    int newval = r.Next(10); 

    //Checks for containment 
    if(!values.Contains(newval)) 
    { 
     values.Add("key",newval); 
    } 
0

你應該增加值到它,並重新生成之前檢查你的哈希表。那麼你最終會得到一個遞歸函數!

2

如果您有n您希望支持的值,並且您只希望將它們用於一次,則常用技巧是先提前對這些值進行洗牌,然後再簡單地按順序返回它們。否則,與消耗的每個連續值相比,您將具有越來越高的碰撞概率。

研究諸如Fisher-Yates之類的混洗算法。

+0

我想說這是最好的答案,但是你會如何處理大量的隨機數字,在這些數字中洗牌會過於機智,並且會超過檢查已經選擇的數字。然後怎樣呢?! – AlanFoster 2011-04-06 15:03:53

1

還要注意,創建隨機當這樣的:

Random r = new Random(); int newval = r.Next(10); 

類是與基於當前時間值初始化。如果你把這段代碼放在一個循環中,那麼你會注意到newval每秒只改變幾次。

最好創建一次Random實例,並在每次需要新的隨機數時重用它。

0

是否有特殊原因您使用Hashtable而不是HashSet?隨着HashSet<int>,你可以很容易地生成N獨特的隨機數:

HashSet<int> Keys = new HashSet<int>(); 
Random rnd = new Random(); 
while (Keys.Count < 10) 
{ 
    Keys.Add(rnd.Next(10)); 
} 

Add方法將返回false如果要添加的值已經是集合中,並且該值將不會被再次添加。

0

至少在處理程序外部創建Random實例。

Random r = new Random(); 
Hashtable values = new Hashtable(); 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    int newval = r.Next(10); 

    values.Add("key",newval); 


    //foreach (object value in values.Values) 
    //{ 
    // Response.Write(value.ToString()); 
    //} 


    ArrayList arrayList = new ArrayList(values.Values); 
    foreach (int key in arrayList) 
    { 
     Response.Write(key); 
    } 
}