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