🎲 隨機數生成:讓你的程式變得不可預測!
各位未來的程式設計師你們好!這一章聽起來可能很簡單,但它涵蓋了程式設計中一個非常重要的概念:如何做出非預先決定的選擇。試想一下遊戲、模擬程式,甚至資訊安全——它們全都依賴某種不可預測性。這就是隨機數生成 (Random Number Generation, RNG) 的用武之地!
在這一課,我們將了解為什麼電腦天生不擅長「即興發揮」、它們是如何偽造隨機性,以及你如何利用這些工具為你的程式打造令人興奮的功能。
如果一開始覺得有點難懂也不用擔心。我們將會運用簡單的類比,確保每個人都能理解電腦隨機性背後的「秘密」!
🤔 第一部分:真隨機與偽隨機
「隨機」真正的含義是什麼?
在現實世界中,拋硬幣或擲一顆完美的骰子是真正的隨機。無論我們如何研究,都無法預先知道結果。
但你知道嗎?電腦是被設計用來遵循演算法 (algorithms)(一套嚴謹的指令集)的。如果電腦總是遵循指令,它又怎麼可能做出真正隨機的事情呢?
簡單來說:它做不到,至少不完全是。
電腦的戲法:偽隨機數
既然電腦必須遵循規則,它就運用了一個聰明的把戲。它會生成偽隨機數 (pseudo-random numbers)。
「偽」(Pseudo) 的意思是「假的」或「偽裝的」。所以,偽隨機數是指看起來很隨機,但實際上是透過固定的數學公式(演算法)所產生的數字。
- 這些數字通過了隨機性的統計測試。
- 但是,如果你知道起點(種子)和公式,你就可以預測出整個數列!
類比時間:食譜
想像一下你在烤蛋糕。如果你使用完全相同的食譜(即演算法)和完全相同的起始材料(即種子值 (seed value),我們稍後會介紹),你每次都會得到一模一樣的蛋糕。蛋糕切開後的樣子可能略有不同,但基本的材料組成並沒有改變。
🔑 重點筆記 1
電腦無法生成真正的隨機數,因為它總是遵循指令(演算法)。相反,它生成的是偽隨機數——即看起來隨機,但如果你知道公式和初始值,就會變得完全可預測的數列。
🔑 第二部分:種子值的關鍵作用
為什麼我們需要一個起點?
如果電腦使用公式來建立一串看起來隨機的數字(例如:5, 23, 4, 98, 11...),那麼除非我們改變起點,否則每次執行程式時,該數列都會是一樣的。
這個起點被稱為種子值 (Seed Value)(或簡稱種子 (Seed))。
種子值是用來初始化偽隨機數生成演算法的數字。
你可以把種子想像成電腦在它的隨機數食譜中放入的第一種材料。
種子如何讓事物看起來隨機
如果你執行一個遊戲並使用固定的種子(例如數字 10),那麼每次玩這個遊戲時,它都會產生完全相同的「隨機」事件!這對遊戲來說很糟糕,但對測試軟體卻很有用。
為了讓程式對使用者來說看起來是真正的隨機,程式語言需要在每次啟動時使用一個獨特的種子。它是從哪裡得到這個獨特數字的呢?
種子生成的步驟:
- 程式語言會尋找一個不斷變化且難以預測的值。
- 最常見的來源是系統時鐘時間 (System Clock Time)(精確到毫秒甚至更小的單位)。
- 由於你每次執行程式的時間都不同,種子也就會不同。
- 不同的種子會生成完全不同的偽隨機數序列。
記憶小撇步: Seed(種子)是 Starting point(起點),用來開始一個 Sequence(數列)。
💡 你知道嗎?
在舊式電子遊戲中,如果你在完全相同的時刻重啟主機,你可能會得到一模一樣的敵人排列或掉落物品,這是因為當時的種子值被重複使用了!
🛠️ 第三部分:在你的程式碼中使用隨機數
指定範圍(最小值與最大值)
在編寫程式時,你通常不只是想要任何隨機數,而是想要一個特定範圍內的數字。例如,如果你要模擬擲骰子,你需要一個 1 到 6 之間的數字,且是包含邊界值 (inclusive)的(意味著 1 和 6 都有可能出現)。
大多數程式語言都提供內建函數或模組來處理隨機數生成,而且它們通常都允許你定義下限(最小值)和上限(最大值)。
我們可以用通用的方式表示這個函數:
RandomNumber = RND(最小值, 最大值)
生成步驟範例(六面骰子)
想像你要寫一行程式碼來模擬標準六面骰子。
- 目標: 生成一個 1 到 6 之間的隨機整數。
- 最小值: 1
- 最大值: 6
- 程式概念:
Roll = RND(1, 6)
現在,程式會使用種子值,套用演算法,並回傳一個介於 1 到 6 之間的結果(例如 3、5 或 1)。
常見的程式錯誤,記得避開!
學生經常會忘記最大值是包含 (inclusive)(代表最大值本身可以被生成)還是不包含 (exclusive)(代表最大值只是上限,本身無法被生成)。
- 大多數 GCSE 等級的函數(例如用於擲骰子的函數)通常都包含最小值和最大值。編寫時請務必查閱你所使用的程式語言文件!
常見的程式應用場景
- 遊戲: 決定敵人位置、造成的傷害、物品掉落或擲骰結果。
- 模擬程式: 模擬天氣模式、交通流量或人口增長,這些情況下某些變數需要保持不可預測性。
- 資訊安全: 生成獨特且難以猜測的密碼或加密金鑰。
⚡ 快速複習
1. 偽隨機 (Pseudo-Random): 看起來隨機,但由可預測的公式產生。
2. 種子值 (Seed Value): 決定整個數列的起始數字。
3. 系統時間 (System Time): 常作為種子使用,確保不可預測性。
4. 範圍 (Range): 你必須指定最小值和最大值(例如 1 到 100)。
恭喜你!你現在已經理解電腦隨機性背後的秘密了。這是一個基礎概念,能讓你建立出更強大、更動態的程式!