我接管了一些奖品绘图代码。
我可以看到这个人正在使用随机数来对它们进行排序,但这实际上是随机的,因为我看不到他做过的任何地方oRand.Next();默认的Random是否会生成实际的随机数。
Random oRand = new Random();
var res = (from l in listNew.AsQueryable<Participant>() //entities.Participant
where l.Status != 0
select l).AsEnumerable().OrderBy(p=>oRand);
答案 0 :(得分:6)
默认的Random是否会生成 实际随机数。
在示例代码中,您按“RandomNumberMaker”排序(即所有值的值相同),而不是随机数。
通过比较LINQPad中的代码(按自然顺序产生数字1到1000),可以快速测试这一点。
void Main()
{
Random oRand = new Random();
var res = Enumerable.Range(1, 1000).OrderBy(p=>oRand);
res.Dump();
}
使用此代码(以伪随机顺序对数字1到1000进行排序):
void Main()
{
Random oRand = new Random();
var res =Enumerable.Range(1, 1000).OrderBy(p=>oRand.Next());
res.Dump();
}
有关随机.NET随机内容的介绍,请查看this article,其优势在于从这个伟大的漫画开始:
alt text http://www.csharpcity.com/wp-content/uploads/2010/05/Dilbert0001.jpg
答案 1 :(得分:1)
我认为你需要oRand.Next()来获取随机数。这看起来最终会被Random对象排序。我没有看到如何使用oRand本身会导致lambda表达式调用Next()。
在任何情况下,当您使用oRand = new Random(); oRand.Next();
时,您会使用时间作为种子获得伪随机数。这意味着每次都有一系列相同的数字,而你开始的数字取决于时间 - 这通常是通过一个函数完成的,你传递最后一个随机数来得到下一个,它有很长一段时间,数字有一个随机的感觉(因此它不仅仅是f(x)=&gt; x + 1或类似的东西)。
这可能不够好,但对于随机的某些定义,它是“随机的”。