以下是一些显示我的问题的简单代码:
void method()
{
for(int i = 0;i<=99)
{
method1();
method2();
}
}
void method1()
{
if(Randombool())
{
bool exists = true;
int n;
while(exists)
{
n=RandNum(100);
exists = list1.Exists(num => num == n);
}
list1.add(n);
}
}
void method2()
{
int n;
bool exists = true;
bool exists2 = true;
while(!(exists && !exists2))
{
n = RandNum(100);
exists = list1.Exists(elem => elem == n);
exists2 = list2.Exists(elem => elem == n);
}
list2.add(n)
}
很明显,很长一段时间它会停留在方法2的while
循环中。
有没有更温和的方法来生成数字,所以我可以避免等待?
答案 0 :(得分:5)
您似乎正在尝试生成N个数字的随机序列。你在这里使用的方法是得到一个随机数,然后丢弃它,如果它是你已经拥有的那个。
您想要做的是Shuffle an Array,这可以合理有效地完成。只需按顺序使用0,1,2,...填充列表,然后将其随机播放。
从上面的链接复制伪代码:
To shuffle an array a of n elements (indices 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]