🎲 隨機數生成:讓你的程式變得不可預測!

各位未來的程式設計師你們好!這一章聽起來可能很簡單,但它涵蓋了程式設計中一個非常重要的概念:如何做出非預先決定的選擇。試想一下遊戲、模擬程式,甚至資訊安全——它們全都依賴某種不可預測性。這就是隨機數生成 (Random Number Generation, RNG) 的用武之地!

在這一課,我們將了解為什麼電腦天生不擅長「即興發揮」、它們是如何偽造隨機性,以及你如何利用這些工具為你的程式打造令人興奮的功能。

如果一開始覺得有點難懂也不用擔心。我們將會運用簡單的類比,確保每個人都能理解電腦隨機性背後的「秘密」!

🤔 第一部分:真隨機與偽隨機

「隨機」真正的含義是什麼?

在現實世界中,拋硬幣或擲一顆完美的骰子是真正的隨機。無論我們如何研究,都無法預先知道結果。

但你知道嗎?電腦是被設計用來遵循演算法 (algorithms)(一套嚴謹的指令集)的。如果電腦總是遵循指令,它又怎麼可能做出真正隨機的事情呢?

簡單來說:它做不到,至少不完全是。

電腦的戲法:偽隨機數

既然電腦必須遵循規則,它就運用了一個聰明的把戲。它會生成偽隨機數 (pseudo-random numbers)

「偽」(Pseudo) 的意思是「假的」或「偽裝的」。所以,偽隨機數是指看起來很隨機,但實際上是透過固定的數學公式(演算法)所產生的數字。

  • 這些數字通過了隨機性的統計測試。
  • 但是,如果你知道起點(種子)和公式,你就可以預測出整個數列!

類比時間:食譜
想像一下你在烤蛋糕。如果你使用完全相同的食譜(即演算法)和完全相同的起始材料(即種子值 (seed value),我們稍後會介紹),你每次都會得到一模一樣的蛋糕。蛋糕切開後的樣子可能略有不同,但基本的材料組成並沒有改變。

🔑 重點筆記 1

電腦無法生成真正的隨機數,因為它總是遵循指令(演算法)。相反,它生成的是偽隨機數——即看起來隨機,但如果你知道公式和初始值,就會變得完全可預測的數列。

🔑 第二部分:種子值的關鍵作用

為什麼我們需要一個起點?

如果電腦使用公式來建立一串看起來隨機的數字(例如:5, 23, 4, 98, 11...),那麼除非我們改變起點,否則每次執行程式時,該數列都會是一樣的。

這個起點被稱為種子值 (Seed Value)(或簡稱種子 (Seed))。

種子值是用來初始化偽隨機數生成演算法的數字。

你可以把種子想像成電腦在它的隨機數食譜中放入的第一種材料。

種子如何讓事物看起來隨機

如果你執行一個遊戲並使用固定的種子(例如數字 10),那麼每次玩這個遊戲時,它都會產生完全相同的「隨機」事件!這對遊戲來說很糟糕,但對測試軟體卻很有用。

為了讓程式對使用者來說看起來是真正的隨機,程式語言需要在每次啟動時使用一個獨特的種子。它是從哪裡得到這個獨特數字的呢?

種子生成的步驟:

  1. 程式語言會尋找一個不斷變化且難以預測的值。
  2. 最常見的來源是系統時鐘時間 (System Clock Time)(精確到毫秒甚至更小的單位)。
  3. 由於你每次執行程式的時間都不同,種子也就會不同。
  4. 不同的種子會生成完全不同的偽隨機數序列。

記憶小撇步: Seed(種子)是 Starting point(起點),用來開始一個 Sequence(數列)。

💡 你知道嗎?

在舊式電子遊戲中,如果你在完全相同的時刻重啟主機,你可能會得到一模一樣的敵人排列或掉落物品,這是因為當時的種子值被重複使用了!

🛠️ 第三部分:在你的程式碼中使用隨機數

指定範圍(最小值與最大值)

在編寫程式時,你通常不只是想要任何隨機數,而是想要一個特定範圍內的數字。例如,如果你要模擬擲骰子,你需要一個 1 到 6 之間的數字,且是包含邊界值 (inclusive)的(意味著 1 和 6 都有可能出現)。

大多數程式語言都提供內建函數或模組來處理隨機數生成,而且它們通常都允許你定義下限(最小值)和上限(最大值)。

我們可以用通用的方式表示這個函數:

RandomNumber = RND(最小值, 最大值)

生成步驟範例(六面骰子)

想像你要寫一行程式碼來模擬標準六面骰子。

  1. 目標: 生成一個 1 到 6 之間的隨機整數。
  2. 最小值: 1
  3. 最大值: 6
  4. 程式概念: 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)。

恭喜你!你現在已經理解電腦隨機性背後的秘密了。這是一個基礎概念,能讓你建立出更強大、更動態的程式!