假设掷骰子的可能结果是 {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/