代码之家  ›  专栏  ›  技术社区  ›  user215675

C#随机对生成

  •  3
  • user215675  · 技术社区  · 16 年前

    什么时候 两个骰子 三次 ,我想随机收集 两个骰子的结果。

    我的实现是

    var q = from threeTimes in new int[] { 1, 2, 3 }
                        let set1 = new Random().Next(1, 6)
                        let set2 = new Random().Next(1, 6)
                        select new { s1 = set1, s2 = set2 };
    
                foreach (var v in q)
                {
                    Console.WriteLine("Die1 :{0} Die2 :{1}", v.s1, v.s2);
                }
    

    我是说

    Die1: 5   Die2:  5
    
    Die1: 2   Die2:  2
    
    Die1: 2   Die2:  2
    

    为了得到随机配对,我需要做什么修正?

    5 回复  |  直到 16 年前
        1
  •  11
  •   Zooba Necrolis    16 年前

    这是因为您正在创建两个 Random 对象可以有效地即时访问。默认情况下,它们很可能使用基于时间的值进行种子设定 Environment.TickCount ,虽然我还没有看到这一点得到证实。

    构建一个 在查询将解决此问题之前,以及将两个对象分别设定种子之前:

    var rnd = new Random();
    var q = from threeTimes in new int[] { 1, 2, 3 }
            let set1 = rnd.Next(1, 6)
            let set2 = rnd.Next(1, 6)
            select new { s1 = set1, s2 = set2 };
    
        2
  •  3
  •   Klaus Byskov Pedersen    16 年前

        3
  •  2
  •   Jeremy McGee    16 年前

    创建一个Random()实例,然后对其调用.Next():

    Random random = new Random();
    var q = from threeTimes in new int[] { 1, 2, 3 }
                        let set1 = random.Next(1, 6)
                        let set2 = random.Next(1, 6)
                        select new { s1 = set1, s2 = set2 };
    
                foreach (var v in q)
                {
                    Console.WriteLine("Dice1 :{0} Dice2 :{1}", v.s1, v.s2);
                }
    
        4
  •  0
  •   Andreas Mattisson    16 年前

    我认为在使用构造函数时,同一秒钟内的两个调用将检索相同的值,这样您就可以使用它。 尝试创建Random的实例,并改用该实例。

    随机r=新随机(); 设set1=r.next(1,6);

        5
  •  0
  •   Yannick Motton    16 年前

    巴特·德斯米特的任务很重 article