2010-08-02 42 views
1

我接管了一些獎品圖紙代碼。這會產生一個隨機獎品圖紙

我可以看到這個人正在使用一個隨機數來排序,但這實際上是隨機的,因爲我無法看到他已經完成的任何地方oRand.Next();默認隨機生成一個實際的隨機數。

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

伴侶,如果這是_real_獎繪圖代碼,你可能想檢查有關此事的地方立法。至少在某些司法管轄區,這不會削減與遊戲監管當局的芥末。他們希望_true_ randomness。 – paxdiablo 2010-08-02 00:22:59

+1

如果您需要.NET Random類的更多詳細信息(例如,有關所述本地立法的討論),請http://msdn.microsoft.com/en-us/library/system.random.aspx參考實現的算法 - Donald E. Knuth的減法隨機數發生器算法。 – Carson63000 2010-08-02 00:58:13

回答

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

我認爲你需要oRand.Next()來獲得隨機數。這看起來最終會由Random對象排序。我沒有看到如何使用oRand本身會導致調用Next()的lambda表達式。

在任何情況下,當您使用oRand = new Random(); oRand.Next();時,您會獲得使用時間作爲種子的僞隨機數。這意味着每次都有一系列相同的數字,並且您開始使用的數字取決於時間 - 這通常是通過一個函數完成的,該函數會傳遞最後一個隨機數以獲取下一個數字,並且它具有很長的一段時間,數字有一個隨機的感覺(所以它不只是f(x)=> x + 1或類似的東西)。

這可能不夠好,但對隨機的某些定義是「隨機的」。