日期:2014-05-18  浏览次数:20999 次

请问,这个随机生成器,怎么回事
List<string> list1 = new List<string>() { "张三", "李四", "小熊", "小利", "小老" };
Random r = new Random();
list1 = list1.OrderBy(x => r.Next()).ToList();
Console.WriteLine(string.Join(",", list1));
Console.ReadKey();

我的问题:
r.Next()随机生成一个数字,list1按照这个数字重新排序
可是,如果删除Random r = new Random();直接写成:list1 = list1.OrderBy(x => new Random().Next()).ToList();

为什么不能重新排序了?

------解决方案--------------------
你修改了以后,变成生成5个Random对象,而每个对象的初始种子是和时间相关的,程序执行很快,你的种子也一样了,所以产生的随机数也一样。

总之,不要在循环遍历里new Random。
------解决方案--------------------
list1 = list1.OrderBy(x => new Random().Next()).ToList();
你这个是每次new一个,排序规则未知
------解决方案--------------------
你的排序规则是什么啊
------解决方案--------------------
那个是伪随机,没听说过吗?虽然每次Next()之后都能得到一个随机数,但是随机是有规律的,因此你new一个新的出来,取第一个随机数将得到相同的数,那样排序自然是不行的。
------解决方案--------------------
探讨

你修改了以后,变成生成5个Random对象,而每个对象的初始种子是和时间相关的,程序执行很快,你的种子也一样了,所以产生的随机数也一样。

总之,不要在循环遍历里new Random。

------解决方案--------------------
后者实际为:5次生成Random r = new Random();

------解决方案--------------------
你循环一下看看每次new Random().Next()其实是一样的
------解决方案--------------------
默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值.但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。
通过创建单个而不是多个 Random 对象可以避免此问题.若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。