随机打乱列表的简单方法[重复]

Posted

技术标签:

【中文标题】随机打乱列表的简单方法[重复]【英文标题】:Simple way to randomly shuffle list [duplicate] 【发布时间】:2018-03-30 07:23:40 【问题描述】:

我有一个颜色列表,我想至少稍微混合一下。

我创建一个列表使用

 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 shuffle算法 我看到了“重复”的帖子,但答案比他们需要的更复杂,必须有一种更简单的方法来洗牌 【参考方案1】:

试试这个(基于 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();

【讨论】:

我将尝试编辑到问题中,但我不断收到 IndexBound 错误 编辑 for 循环: for (int i = colors.Count - 1; i > 1; i--) 。我也更新了答案。如果它有用并点赞,请标记为答案。 运行时没有错误。我测试了它。你在哪里得到错误?也没有必要这样做 colorList = colors; 刚刚注意到我在运行 SetupColors 之前运行了 getMessages int n 未使用。这是故意的吗? @GaurangDave

以上是关于随机打乱列表的简单方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python 如何随机打乱列表(List)排序

Swift 获取数组内任意个数随机元素的简单方法

随机洗牌列表[重复]

java list随机打乱

如何在vim中打乱列表?

需要一个JavaScript代码,生成1--100之间的随机数一共一百个,每行显示10个数字,而且这