随机打乱列表的简单方法

3
我有一个颜色列表,我希望它们被洗牌和混合至少一点。
我使用以下代码创建列表:
 List<Color> colors = new List<Color> ();
 colors.Add(Color.Black);
 colors.Add(Color.White);
 colors.Add(Color.Red);

但是我注意到没有 .Shuffle 方法,我看到了 .Sort 但我不认为那是我需要的。我搜索了一会儿,但我发现所有的方法和其他问题似乎都对于这样一个简单的任务而言过于复杂,如果有更简单的方法的话。
我尝试使用:
List<Color> colorList = new List<Color>();
public void SetupColors()
    {
        List<Color> colors = new List<Color> ();
        colors.Add(Color.BLACK);
        colors.Add(Color.WHITE);
        colors.Add(Color.RED);
        Random random = new Random();
        int n = colors.Count;

        for (int i = colors.Count; i > 1; i--)
        {
            int rnd = random.Next(i + 1);

            var value = colors[rnd];
            colors[rnd] = colors[i];
            colors[i] = value;
        }
        colorList = colors;
    }

    public List<Message> getMessages()
    {
        List<Message> items = new List<Message>
        {
            new Message
            {
                . . . 
                Background = colorList[0]
            },
            new Message
            {
                . . . 
                Background = colorList[1]
            }
        };

        return items;
    }

但是我一直在colorList[0]colorList[1]处收到IndexBound错误。

看一下 Fisher-Yates 洗牌算法。 - tigrou
我看到了“重复”的帖子,但是答案比必要的复杂,肯定有更简单的方法来洗牌列表。 - Dan
1个回答

10
尝试这个(基于Fisher-Yates洗牌算法)
public static void ShuffleMe<T>(this IList<T> list)  
{  
    Random random = new Random();  
    int n = list.Count;  

    for(int i= list.Count - 1; i > 1; i--)
    {
        int rnd = random.Next(i + 1);  

        T value = list[rnd];  
        list[rnd] = list[i];  
        list[i] = value;
    }
}

List<Color> colors = new List<Color> ();
colors.Add(Color.Black);
colors.Add(Color.White);
colors.Add(Color.Red);

colors.ShuffleMe();

我将我的尝试编辑到问题中,但我仍然收到IndexBound错误。 - Dan
编辑 for 循环:for (int i = colors.Count - 1; i > 1; i--)。我也更新了答案。如果有用,请标记为答案并点赞。 - Gaurang Dave
我在运行时没有错误。我已经进行了测试。你是在哪里出现错误的?此外,不需要执行 colorList = colors。 - Gaurang Dave
刚刚注意到在运行 SetupColors 之前我正在运行 getMessages。 - Dan
@Dan 热爱编程。 - Gaurang Dave
1
"int n" 没有被使用。这是故意的吗?@GaurangDave - Wesley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接