亂數

System 命名空間裏面有一個專門用於產生亂數的 Random 類別, Random 提供兩種型式的建構式,列舉如下:
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 。



沒有留言: