随机播放无法输出相同数字两次的列表

时间:2014-02-14 20:03:24

标签: c# list random

我有两个List<int>,我们称之为Pool,另一个Used

Pool0X之间有整数,而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等跳出来做一些疯狂的事情,我不明白为什么。

这不应该有效吗?我该如何解决?

2 个答案:

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