如何避免重复次数

时间:2011-04-06 14:50:45

标签: c# hashtable

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);
    }
}

7 个答案:

答案 0 :(得分:2)

如果您希望支持 n 值,并且只希望它们使用一次,则常见的技术是提前对这些值进行洗牌,然后按顺序返回它们。否则,与消耗的每个连续值碰撞的概率越来越高。

研究诸如Fisher-Yates之类的改组算法。

答案 1 :(得分:1)

另请注意,当像这样创建随机时:

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

使用基于当前时间的值初始化类。如果你将这段代码放在循环中,那么你会注意到newval每秒只改变几次。

最好创建一次Random实例,并在每次需要新的随机数时重复使用它。

答案 2 :(得分:0)

这是随机的。根据定义,存在数字将重复的统计可能性。您可以将1-10中的10个随机整数添加到列表中,并且它们不会重复,但不太可能。

理想情况下,每次调用随机函数时,获得任何一个数字与获取任何其他数字的几率完全相同,包括上次获得的数字。

答案 3 :(得分:0)

如果您不希望值重复 - 您可以在添加值之前执行检查,以查看新值是否包含在当前值集中(如果这是您要求的话

如果您想避免将重复值添加到值中,您可以执行以下操作:

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

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

答案 4 :(得分:0)

在向其中添加值并重新生成之前,应检查哈希表。那么你最终会得到一个递归函数!

答案 5 :(得分: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,并且该值不会再次添加。

答案 6 :(得分: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);
    }
}