我有两个List<int>
,我们称之为Pool
,另一个Used
。
Pool
在0
和X
之间有整数,而Used
的整数来自Pool
列表。
所以我想要实现的是从Pool
列表中随机抽取,其中绘图不包含在Used
列表中的任何位置。如果我已经使用了所有数字,我希望它跳回0
。
这是我提出的,但它不起作用
int x = 0;
int ri = 0;
Random r = new Random();
while (true)
{
ri = r.Next(0, Pool.Count);
if (!Used.Contains(ri))
{
break;
}
else
{
x += 1;
}
if(x == Used.Count) // Here I check if it has tried getting a new random number but failed since the Pool is "empty"
{
ri = 0;
UsedIndexes = new List<int>();
break;
}
}
当我使用它时,它会从0-2-4-6-8
等跳出来做一些疯狂的事情,我不明白为什么。
这不应该有效吗?我该如何解决?
答案 0 :(得分:2)
List<int> pool = new List<int>() { 1, 2, 3, 4, 5 };
List<int> used = new List<int>();
Random r = new Random();
while (pool.Count > 0)
{
int idx = r.Next(pool.Count);
used.Push(pool[idx]);
pool.RemoveAt(idx);
}
// Now used contains random iteration of 1,2,3,4,5
// To loop again, just assign used back to pool and repeat
pool = used;
used = new List<int>();
或者,做一个Fisher-Yates shuffle(可以在适当的地方完成),然后只需要经过它们0到n。当你到达n时,重新洗牌,然后从0开始。
答案 1 :(得分:0)
这应该可以达到你想要的效果。
Random r = new Random();
var pool = new List<int>() { 1, 2, 3, 4, 5 };
var used = new List<int>();
while(used.Count != pool.Count) {
var ri = r.Next(0, pool.Count);
var choice = pool[ri];
if (!used.Contains(choice)) {
Console.WriteLine(choice);
used.Add(choice);
}
}
used.Clear();