2014年9月13日 星期六

小山的 C# 教學-第30課-亂數 Random

本課簡介

如果想要在程式之中隨機產一個數字該怎麼做呢?
此時就該 Random 登場囉!

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!



重點提示

1. 想要產生亂數的話,可以使用 C# 內建的 Random 物件

2. 建立出一個 Random 物件之後,就等同於有了一個亂數產生器

3. Random Class 的主要功能就是產生亂數,主要的 method 就是 Next( ),Next( ) 有三種版本:

(1) int Next( )
沒有參數的版本
產生的亂數介於 0 到整數最大值之間 (0~2147483647)

(2) int Next(int maxValue)
參數為上限
產生的亂數介於 0 到 maxValue 之間 (不含 maxValue)

(3) int Next(int minValue, int maxValue)
參數為下限與上限
產生的亂數介於 minValue 與 maxValue 之間 (含 minValue 但不含 maxValue)

補充

電腦沒有真亂數

這話怎麼說?

事實上,電腦產生亂數的方法,是經由一系列的數學計算出的結果。而這個計算過程之中,基本上是沒有隨機的成分存在,所以產生出來的結果就是固定的。

舉個簡單的例子,我們都知道 1 + 1 = 2,不會隨著我們在不同地方算而得到不同結果。電腦產生亂數的計算也是這樣,不會隨著情況不同而有不同的結果。如果我不想要得到 2,那我們就要改變相加的數字。

因此,Random Class 給了我們一個機會來得到不同的結果。在建立 Random Class 物件時,你可以給它一個 seed (種子),來加入亂數計算的過程,以擾亂亂數的結果。甚麼時候給?就是在你呼叫下面這行程式碼時候:
Random random = new Random(); 這個 constructor 有另一個版本:
Random random = new Random(int seed); 如果我們呼叫這個版本的 constructor ,那麼就會根據我們給定的 seed 來產生亂數。如果兩個 Random 物件的 seed 一樣,那們它們就會得到同一組亂數。(請嘗試看看練習)

通常我們為了要避免每次執行程式的結果都相同,我們會在程式內把執行程式的時間當作 seed 丟給 Random。幸好,如果你呼叫了沒有參數的 new Random( ),那麼裡面就會自動取得現在時間做為 seed 來用了。這是為了避免以前大多數程式設計師在寫 C 語言的亂數時常犯的錯誤。

練習

把今天教學中,建立 Random 物件的程式碼換成下面這行
Random random = new Random(543); 然後多按幾次按鈕,有沒有發現甚麼呢?

這就是所謂「電腦裡沒有真亂數」的意思
(詳情請參考補充)

相關資訊連結

MSDN - Random Class

http://msdn.microsoft.com/zh-tw/library/system.random%28v=vs.110%29.aspx

12 則留言:

  1. 小山老師 請問之後會有C#對database的部分或是對表單設計之類的嗎?
    期待~


    呵呵...因為我是自學這邊真的很不錯
    很多概念都懂了

    回覆刪除
  2. 小山老師,這裡真的很不錯!~ 給你一個讚!!

    回覆刪除
  3. 感謝小山老師~~ 希望能有新的教學!!

    回覆刪除
  4. 小山老師:希望您能夠在出一部有關於RS-232傳送與接收的影片教學,例如我有1顆IC持續的透過RS-232傳送出一些數字,那我要如何寫C#來接收這個部分呢(例如透過1個BUTTON按下去之後就能夠接收),或是當我電腦丟個數字透過RS-232傳出去,然後透過我自己的TOOL來顯示數字,那傳送的部分要如何用C#來完成呢?盼小山老師能夠出有關於這部分的影片,感謝感謝。

    回覆刪除
  5. 老師 我想請問一下
    如果亂數D,整數X,而8>X>6
    是不是只能有 X = (int)(d*2)+6
    這個做法

    回覆刪除
  6. 老師 我想請問
    要如何取出數個不重複的亂數??

    回覆刪除
  7. 請問一下如何用按鈕來比大小1~14不可以有7

    回覆刪除
  8. 亂數範圍如果是0~(2^63)-1 = 0~92233....775807
    如果直接用%來做限制範圍 可能會有機率些微不平等的狀況
    比如%10的話0~7的機率多一次的可能性
    雖然非常非常小 但有強迫症的用了不舒服 哈哈

    回覆刪除
  9. 作者已經移除這則留言。

    回覆刪除