C#的Random到底該怎么使用


 先看代碼:

在循環中,有的只NEW一個Random,有的每次都NEW 一個Random。

 1   Console.WriteLine("1.多個Random,默認隨機種子,");
 2             for (int i = 1; i < 10;i++ )
 3             {
 4                 Random r1 = new Random();
 5                 int v = r1.Next(100);
 6                 Console.Write(v); Console.Write(" ");
 7                 System.Threading.Thread.Sleep(100);
 8             }
 9             Console.WriteLine("\n");
10 
11             Console.WriteLine("2.多個Random,指定隨機種子");
12             for (int i = 1; i < 10; i++)
13             {
14                 Random r2 = new Random(100);
15                 int v = r2.Next(100);
16                 Console.Write(v); Console.Write(" ");
17                 System.Threading.Thread.Sleep(100);
18             }
19             Console.WriteLine("\n");
20 
21             Console.WriteLine("3.一個Random,默認隨機種子");
22             Random r3 = new Random();
23             for (int i = 1; i < 10; i++)
24             {
25                 int v = r3.Next(100);
26                 Console.Write(v); Console.Write(" ");
27                 System.Threading.Thread.Sleep(100);
28             }
29             Console.WriteLine("\n");
30 
31             Console.WriteLine("4.一個Random,指定隨機種子");
32             Random r4 = new Random(100);
33             for (int i = 1; i < 10; i++)
34             {
35 
36                 int v = r4.Next(100);
37                 Console.Write(v); Console.Write(" ");
38                 System.Threading.Thread.Sleep(100);
39             }
40             Console.WriteLine("\n");
41 
42             Console.Read();
View Code

運行第一次結果:

運行第二次結果:

 

1.第二種情況中,產生的隨機數為固定值
2.第四種情況中,每次產生的一組隨機數為固定值.
3.第一和第三種,每次產生的都不相同.(默認隨機種子).

查看MSDN,正好也闡述了為什么會出現第二和第四種情況.

如果同一個種子用於單獨 Random 對象,則它們將生成相同的一系列隨機數字。 這可以是用於創建測試套件,用於處理隨機值,或者用於重播從隨機數字派生其數據的游戲。 但請注意, Random 不同版本的.NET Framework 下運行的進程中的對象可能會返回不同的隨機數字的序列,即使它們使用相同的種子值實例化.
若要生成的隨機數的不同序列,您可以種子值依賴於時間,從而產生不同的系列的每個新實例 Random。 參數化 Random(Int32) 構造函數可以采用 Int32 值根據計時周期數以當前時間,而無參數 Random() 構造函數使用系統時鍾生成其種子值。 不過,由於時鍾具有有限的解決方法,使用無參數構造函數來創建不同 Random 中連續的對象創建生成的隨機數的相同序列生成器。 下面的示例闡釋了兩個 Random 連續實例化的對象生成相同的一系列隨機數字。 在大多數 Windows 系統, Random 在另一個 15 毫秒內創建的對象可能會遇到的相同種子值。

 

以前一直覺得出現第二種情況和第四種情況中,出現相同隨機數是bug,直到今天我遇到如下情況,我發現這個還真是有用.
我寫了一個程序,瘋狂的制造隨機數,往數據庫里面直接插入數據.業務數據來自一些固定的客戶端,某些客戶端可能幾天不會產生數據.為了使數據看起來更真實一些,就必須隨機一些客戶端不產生數據.
開始生成的不產生數據的客戶端是隨機的,譬如C1,c2,c3.N天后,變成兩外的一批客戶端不產生數據,譬如C1,C4,C6,C9.(用Timer在N天后觸發).
但是這樣有一個問題:當我的程序在N天之內被重啟后,隨機的客戶端就變化了.達不到要求.我希望程序在N天內重啟的時候,隨機出的客戶端list,不會變化
這時候,"生成相同的一系列隨機數字"就派上用處了.
譬如下面,用這個方法來產生隨機種子:

 1 private int SeedByDate()
 2 {
 3 
 4 DateTime now = DateTime.Now();
 5 DateTime dtbegin = new DateTime(DateTime.Now.Year, 1, 1);
 6 
 7 int diffday = now.DayOfYear % 3;//3天一個循環
 8 DateTime result = dtbegin.AddDays(now.DayOfYear - diffday);
 9 return (int)result.Ticks;
10 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM