这会产生随机抽奖

时间:2010-08-02 00:17:38

标签: c#

我接管了一些奖品绘图代码。

我可以看到这个人正在使用随机数来对它们进行排序,但这实际上是随机的,因为我看不到他做过的任何地方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);

2 个答案:

答案 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或类似的东西)。

这可能不够好,但对于随机的某些定义,它是“随机的”。

相关问题