随机洗牌的简单方法

时间:2018-03-30 07:23:40

标签: c# xamarin xamarin.forms

我有一个颜色列表,我想要洗牌并至少混合一点。

我使用

创建一个列表
 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错误

1 个答案:

答案 0 :(得分:4)

试试这个(基于Fisher-Yates shuffle算法)

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