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();为什么不能重新排序了?

解决方案 »

  1.   

    你修改了以后,变成生成5个Random对象,而每个对象的初始种子是和时间相关的,程序执行很快,你的种子也一样了,所以产生的随机数也一样。总之,不要在循环遍历里new Random。
      

  2.   

    list1 = list1.OrderBy(x => new Random().Next()).ToList();
    你这个是每次new一个,排序规则未知
      

  3.   

    那个是伪随机,没听说过吗?虽然每次Next()之后都能得到一个随机数,但是随机是有规律的,因此你new一个新的出来,取第一个随机数将得到相同的数,那样排序自然是不行的。
      

  4.   

    后者实际为:5次生成Random r = new Random();
      

  5.   

    你循环一下看看每次new Random().Next()其实是一样的
      

  6.   

    可是,为什么每次new Random().Next()其实是一样的啊?
      

  7.   

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