咨询区

  • mirezus

是否有一个最佳的方式对 List<T> 进行洗牌排序,我的项目有一个抽奖模块,需要对一个有 75个元素的 List<T> 进行随机排序,请问大家有什么好的实现方式。

回答区

  • user453230

如果你仅仅是想对List中的item进行随机化排序,我个人推荐一种高效的方式,那就是按照 GUID 排序,参考如下代码:


var shuffledcards = cards.OrderBy(a => Guid.NewGuid()).ToList();

评论中有朋友指出了,GUID并不能保证完全随机化,所以还有另外一种方式就是使用 Random 类替代,参考如下:


private static Random rng = new Random();
...
var shuffledcards = cards.OrderBy(a => rng.Next()).ToList();
  • Xelights

如果你不介意使用两个List的话,那么我这个将是最简单粗暴的实现方式,但它不是最高效的。


List<int> xList = new List<int>() { 1, 2, 3, 4, 5 };
List<int> deck = new List<int>();foreach (int xInt in xList)deck.Insert(random.Next(0, deck.Count + 1), xInt);
  • Shehab Fawzy

你可以通过 扩展方法 的形式实现,首先定义一个扩展方法。


public static class IEnumerableExtensions
{public static IEnumerable<t> Randomize<t>(this IEnumerable<t> target){Random r = new Random();return target.OrderBy(x=>(r.Next()));}
}

然后可以像下面这样调用。


// use this on any collection that implements IEnumerable!
// List, Array, HashSet, Collection, etcList<string> myList = new List<string> { "hello", "random", "world", "foo", "bar", "bat", "baz" };foreach (string s in myList.Randomize())
{Console.WriteLine(s);
}

点评区

这个问题挺有意思,前几年在项目开发中还真有这么一个需求,第一次我采用了 Guid.NewGuid(),但相信用过的朋友都知道,这玩意用起来真的太慢了,尤其上十万数据之后,所以后期采用了 new Random() 的方式。

如何洗牌 ListT 中的元素?相关推荐

  1. python 内推_网易有道2017内推编程题 洗牌(python)

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  2. 有道python网课怎么样-网易有道2017内推编程题 洗牌(python)

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  3. 关于如何评价洗牌质量的猜想

    关于如何评价洗牌质量的猜想 洗牌算法是卡牌类游戏中必须使用的算法,本质上说洗牌算法的目的是使某个给定的顺序更加的无序,因此出现了很多种洗牌算法.我们不重点讨论如何洗牌,我们将眼光关注于洗出的牌是否达到 ...

  4. 不会洗牌的数学家不是好魔法师

    不要走开,精彩马上开始! 在<今天教教大家如何完美洗牌>中,我们介绍了魔术师可以用洗牌来做什么.但是,数学家在洗牌的时候会怎么做呢?为此我们咨询了来自西澳大利亚大学的教授谢丽尔·普拉格(C ...

  5. 完美洗牌问题——核心思想与代码

    完美洗牌问题系列文章: 提示:很重要的思想 1.完美洗牌问题--整体交换数组的左右2部分 2.完美洗牌问题--计算位置i下次要被挤到哪个位置j? 这2个文章,都是为本文做铺垫的,循序渐进理解什么是完美 ...

  6. HDU1210 Eddy's 洗牌问题【递推函数+模拟】

    Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  7. 洗牌 --网易有道2017内推编程题

    题目描述 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半 ...

  8. 洗牌-牛客 第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000

    题目描述: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上 ...

  9. 牛客网做题笔记--洗牌问题

    题目描述: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上 ...

最新文章

  1. jquery封装的ajax请求
  2. 背包系列 hdu3449 有依赖背包
  3. 操作系统概念学习笔记 11 进程同步(一)
  4. 成功解决The NVIDIA driver on your system is too old (found version 9010). Please update your GPU driver
  5. [译] 机器学习可以建模简单的数学函数吗?
  6. mmap函数_分析由 mmap 导致的内存泄漏
  7. AMD深度学习库MIOpen更新,支持CNN加速
  8. DB2 9 根本(730 检修)认证指南,第 6 局部: 数据并发性(2)
  9. Gallery3D简介
  10. Web前端大作业 HTML+CSS+JS 防天天生鲜官网 9页 (1)
  11. thymeleaf 默认选中下拉框(select option)
  12. Mysql全国省区县地区码
  13. VUE项目开发,使用开发者工具查看源文件
  14. 春运抢火车票攻略汇总(持续更新中)
  15. 初中计算机课感悟,初中信息技术课教育随笔
  16. ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately..
  17. 解决conda在Downloading and Extracting Packages时下载速度慢的问题
  18. 多种模块拔号上网驱动开发调试
  19. C#根据工作经验来谈谈面向对象
  20. Python 1-10 字符串操作

热门文章

  1. MySQL--3--mysqldump备份策略
  2. Silverlight中摄像头的运用—part2
  3. python treeview底部加个按钮_Python爬取京东商品信息(GUI版本)
  4. maven项目的目录结构
  5. 初级图像混合——线性混合操作
  6. 补作业:随机生成二元四则运算
  7. linux工具:ssh---未完
  8. 第2天:汇编语言与Makefile
  9. 关于castle和Could not find the dialect in the configuration错误
  10. IM实现联系人及联系人分组的数据库设计