C# 随机对生成

标签 c# linq

假设掷骰子的可能结果是 {1,2,3,4,5,6} 之一

两个骰子被掷三次时,我想随机收集 两个骰子的结果。

我的实现是

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 和 Die2 的值相同。

我是说

Die1: 5   Die2:  5

Die1: 2   Die2:  2

Die1: 2   Die2:  2

为了获得随机对,我需要进行哪些修正?

最佳答案

发生这种情况是因为您正在即时有效地创建两个 Random 对象。默认情况下,它们使用基于时间的值播种,很可能是 Environment.TickCount,但我还没有看到这一点得到证实。

在查询之前构建一个 Random 将解决这个问题,同时将两个对象分开播种:

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 };

关于C# 随机对生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1831382/

相关文章:

c# - 如何在 C# 中确定系统是否支持触摸

c# - 如何在 SOAP header 中声明命名空间前缀

c# - 是否有任何用于扭曲/扭曲图像的 .NET 工具?

c# - 修剪结束节点满足某些条件的 Twig

c# - 如何在 LINQ (C#) 中对不同的值进行排序?

c# - 如何在 Linq 中提高此查询性能?

c# - 从 RSS 源下载图片时遇到问题?

c# - 使用任何方法在 openTK 应用程序中播放音频的最简单方法

c# - 使用 Lambda 表达式合并 IEnumerable<T> 时出现问题

c# - 形成两个列表并集的最简单方法