如何避免重复号码
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);
}
}
这是随机的。根据定义,存在统计数字会重复的可能性。您可以将1-10个随机整数添加到列表中,并且不会重复,但这不太可能。
理想情况下,每次调用随机函数时,获得任意一个数字的几率与获取其他数字的几率完全相同,包括上次得到的数字。
如果你不想值重复 - 你可以将其添加到查看新的值包含在当前设置值之前执行检查(如果这是你所要求)
如果你想避免增加在重复的值 - 到值,你可以这样做:
Random r = new Random();
int newval = r.Next(10);
//Checks for containment
if(!values.Contains(newval))
{
values.Add("key",newval);
}
你应该增加值到它,并重新生成之前检查你的哈希表。那么你最终会得到一个递归函数!
如果您有n您希望支持的值,并且您只希望将它们用于一次,则常用技巧是先提前对这些值进行洗牌,然后再简单地按顺序返回它们。否则,与消耗的每个连续值相比,您将具有越来越高的碰撞概率。
研究诸如Fisher-Yates之类的混洗算法。
我想说这是最好的答案,但是你会如何处理大量的随机数字,在这些数字中洗牌会过于机智,并且会超过检查已经选择的数字。然后怎样呢?! – AlanFoster 2011-04-06 15:03:53
还要注意,创建随机当这样的:
Random r = new Random(); int newval = r.Next(10);
类是与基于当前时间值初始化。如果你把这段代码放在一个循环中,那么你会注意到newval每秒只改变几次。
最好创建一次Random实例,并在每次需要新的随机数时重用它。
是否有特殊原因您使用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
如果要添加的值已经是集合中,并且该值将不会被再次添加。
至少在处理程序外部创建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);
}
}
而问题是... – 2011-04-06 14:53:18
我想你的问题“当生成一个随机的整数集合时,我该如何确保我没有任何重复的数字?那是对的吗? – asawyer 2011-04-06 14:54:09
你想避免重复的键或值?您何时想避开它们 - 何时添加到Hashtable中,或者何时从ArrayList中写出它们? – JohnK813 2011-04-06 14:55:16