如何洗牌 ListT 中的元素?
咨询区
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 中的元素?相关推荐
- python 内推_网易有道2017内推编程题 洗牌(python)
本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...
- 有道python网课怎么样-网易有道2017内推编程题 洗牌(python)
本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...
- 关于如何评价洗牌质量的猜想
关于如何评价洗牌质量的猜想 洗牌算法是卡牌类游戏中必须使用的算法,本质上说洗牌算法的目的是使某个给定的顺序更加的无序,因此出现了很多种洗牌算法.我们不重点讨论如何洗牌,我们将眼光关注于洗出的牌是否达到 ...
- 不会洗牌的数学家不是好魔法师
不要走开,精彩马上开始! 在<今天教教大家如何完美洗牌>中,我们介绍了魔术师可以用洗牌来做什么.但是,数学家在洗牌的时候会怎么做呢?为此我们咨询了来自西澳大利亚大学的教授谢丽尔·普拉格(C ...
- 完美洗牌问题——核心思想与代码
完美洗牌问题系列文章: 提示:很重要的思想 1.完美洗牌问题--整体交换数组的左右2部分 2.完美洗牌问题--计算位置i下次要被挤到哪个位置j? 这2个文章,都是为本文做铺垫的,循序渐进理解什么是完美 ...
- HDU1210 Eddy's 洗牌问题【递推函数+模拟】
Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 洗牌 --网易有道2017内推编程题
题目描述 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半 ...
- 洗牌-牛客 第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000
题目描述: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上 ...
- 牛客网做题笔记--洗牌问题
题目描述: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上 ...
最新文章
- jquery封装的ajax请求
- 背包系列 hdu3449 有依赖背包
- 操作系统概念学习笔记 11 进程同步(一)
- 成功解决The NVIDIA driver on your system is too old (found version 9010). Please update your GPU driver
- [译] 机器学习可以建模简单的数学函数吗?
- mmap函数_分析由 mmap 导致的内存泄漏
- AMD深度学习库MIOpen更新,支持CNN加速
- DB2 9 根本(730 检修)认证指南,第 6 局部: 数据并发性(2)
- Gallery3D简介
- Web前端大作业 HTML+CSS+JS 防天天生鲜官网 9页 (1)
- thymeleaf 默认选中下拉框(select option)
- Mysql全国省区县地区码
- VUE项目开发,使用开发者工具查看源文件
- 春运抢火车票攻略汇总(持续更新中)
- 初中计算机课感悟,初中信息技术课教育随笔
- ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accurately..
- 解决conda在Downloading and Extracting Packages时下载速度慢的问题
- 多种模块拔号上网驱动开发调试
- C#根据工作经验来谈谈面向对象
- Python 1-10 字符串操作