2011-04-06 90 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); 
    } 
}