System 命名空間裏面有一個專門用於產生亂數的 Random 類別, Random 提供兩種型式的建構式,列舉如下:
第二個版本的建構式,接受一個 int 參數 Seed ,它是一個亂數種子,被當作亂數的初始值,如果指定相同的起始值,將會產生相同的亂數,底下的程式碼指定以10為亂數種子,建立Random物件:
以下是輸出結果,敲擊任意鍵可以持續輸出亂數值。
特定範圍亂數
NextDouble 與 Next 是兩個用來產生亂數的主要方法,不過這兩種方法所產生的亂數,顯然無法符合需求,在大部份的情形下,我們需要的是一個在特定範圍裏面的亂數,而 Next 另外定義了兩個多載的版本,可以達到這樣的需求。
第二個多載版本的 Next 接受兩個 int 參數: minValue 與 maxValue ,新產生的亂數則大於等於 minValue ,小於 maxValue ,如果傳入了兩個相同的整數當作參數,則這個參數被當作一個新的亂數傳回,再一次調整取亂數的程式碼:
亂數種子
Random依據一個特定的種子值產生亂數,在需設的情形下,種子值以系統時間為依據,因此每一次建立Random物件之後,利用時間點的差異輸出不重複的值,Random有另外一個版本的建構式,接受一個作為亂數種子的整數,用法如下:
以下的範例程式碼,讓使用者輸入亂數的初始值,並據以產生亂數,其中透過Parse方法進行型別的轉換。
public Random() public Random(int Seed)Random 類別不同於 Math ,每個亂數的產生都必須透過實體來建立,因此在取得亂數之前,必須以上述的建構式,建立所需的 Random 物件,例如底下這一行程式碼:
Random random = new Random() ;其中建立一個名稱為 random 的物件,緊接著我們便可以利用這個物件引用其提供的方法,產生一個亂數。
第二個版本的建構式,接受一個 int 參數 Seed ,它是一個亂數種子,被當作亂數的初始值,如果指定相同的起始值,將會產生相同的亂數,底下的程式碼指定以10為亂數種子,建立Random物件:
Random theRandom = new Random(10) ;Random 類別提供了幾個產生亂數的方法,其中最主要者為 Next ,定義如下:
public virtual int Next()這個方法回傳一個 int 整數值,數值範圍介於 0 ~ 2,147,483,647,也就是大於等於 0而小於 int 的最大值。
class Program { static void Main(string[] args) { Console.WriteLine("按任意鍵持續產生亂數,按「X」或「x」離開程式 ... \n\n"); Random random = new Random(); char c; do { string n = random.Next().ToString(); Console.WriteLine(n); c = Console.ReadKey().KeyChar; } while (c != 'X' && c != 'x'); } }以上這段範例程式碼,在 do-while 迴圈中建立一個 Random 物件,並且調用 Next() 方法,取得亂數值輸出主控台,接下來讓使用者輸入任意鍵值,如果不是「x」則繼續取出下一個亂數,否則的話跳出程式。
以下是輸出結果,敲擊任意鍵可以持續輸出亂數值。
按任意鍵持續產生亂數,按「X」或「x」離開程式 ... 884230268 1519986073 1695723074 1651546225
特定範圍亂數
public virtual double NextDouble()這個方法回傳一個 double 型別亂數,範圍介於 0.0 ~ 1.0 之間,嘗試修改上述範例調整其中呼叫 Next 方法的程式碼如下:
string n = random.NextDouble().ToString();重新執行此範例,會得到具小數的數值。
按任意鍵持續產生亂數,按「X」或「x」離開程式 ... 0.309190875063274 0.317305151055243 0.114478190948478 0.785709591948292這是引用 NextDouble 方法的版本,與上述的 Next 方法版本比較可以看出差異。
NextDouble 與 Next 是兩個用來產生亂數的主要方法,不過這兩種方法所產生的亂數,顯然無法符合需求,在大部份的情形下,我們需要的是一個在特定範圍裏面的亂數,而 Next 另外定義了兩個多載的版本,可以達到這樣的需求。
public virtual int Next (int maxValue) public virtual int Next (int minValue,int maxValue)第一個多載版本的 Next 接受一個 int 參數 maxValue ,其產生的亂數值將小於 maxValue 並且大於等於 0 ,必須注意的是, maxValue 的值需大於等於 0 。
第二個多載版本的 Next 接受兩個 int 參數: minValue 與 maxValue ,新產生的亂數則大於等於 minValue ,小於 maxValue ,如果傳入了兩個相同的整數當作參數,則這個參數被當作一個新的亂數傳回,再一次調整取亂數的程式碼:
string n = random.Next(10,1000).ToString();以下是這個版本輸出的結果,可以發現每一個亂數值均介於 10 與 1000 之間。
按任意鍵持續產生亂數,按「X」或「x」離開程式 ... 81 789 860 781
亂數種子
Random依據一個特定的種子值產生亂數,在需設的情形下,種子值以系統時間為依據,因此每一次建立Random物件之後,利用時間點的差異輸出不重複的值,Random有另外一個版本的建構式,接受一個作為亂數種子的整數,用法如下:
Random random = new Random(100);以這一行程式碼產生的Random物件,其中指定了100作為亂數種子,因此每一個物件輸出的亂數系列均會相同,請自行修改上述的範例,比較每一次執行結果,可以看到相同的亂數系列數值。
以下的範例程式碼,讓使用者輸入亂數的初始值,並據以產生亂數,其中透過Parse方法進行型別的轉換。
namespace TypesDemo { class Program { static void Main(string[] args) { Random random = new Random(); Console.Write("Random seed :"); int a = int.Parse(Console.ReadLine()); Console.WriteLine(random.Next(a).ToString()); Console.Write("Random seed min:"); int min = int.Parse(Console.ReadLine()); Console.Write("Random seed max:"); int max = int.Parse(Console.ReadLine()); Console.WriteLine(random.Next(min, max).ToString()); Console.ReadKey(); } } }這段程式碼分別要求使用者輸入作為亂數初始值的整,Console.ReadLine 取得入的字串,透過引用 int.Parse 方法,將其轉換成對應的整數,然後據以產生亂數,來看
Random seed :99 41 Random seed min:10 Random seed max:870 249第一行輸入的99,透過int.Parse 方法轉換成為整數型別,然後取得亂數,接下來的min以及max,指定取得的亂數範圍,最後輸出 249 。
沒有留言:
張貼留言