2024-05-05|閱讀時間 ‧ 約 24 分鐘

無痛入手 C++:函式庫教學 - 如何產生亂數

C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。

基本用法

首先要導入 C 語言的標準函式庫:

#include <cstdlib>

以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式做使用。

負責產生亂數的函式叫做: rand(),它會隨機產生一個介於 0 到某個很大的數值之間的整數。下面的程式會隨機產生 10 個亂數:

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
for (int i = 0; i < 10; ++i)
cout << rand() << '\n';
return 0;
}

把上述的程式反覆多執行幾遍,應該會發現每次執行所印出來的數字都是一樣的。

這是因為亂數的產生是仰賴某個"種子"(random seed),如果希望得到不同的結果,就需要在每次執行的時候,設定不一樣的種子。

我們可以利用 srand() 這個函式來設定亂數種子。呼叫這個函式的時候要傳入一個數值當作亂數種子,如下:

srand(777);
for (int i = 0; i < 10; ++i)
cout << rand() << '\n';

亂數種子要設成什麼值都無所謂,只要每次執行程式的時候,設定成不一樣種子就可以了。但我們要如何做到這點呢?

我們可以利用 time() 這個函式來做到這點,它會回傳從 1970 年 1 月 1 號到程式呼叫函式的時候經過了多少秒。要使用這個函式的話要導入另一個函式庫:

#include <ctime>

只要將亂數種子設定成 time() 回傳的值,就可以在每次程式執行的時候設定不一樣的亂數種子了。如下:

srand(time(0));
for (int i = 0; i < 10; ++i)
cout << rand() << '\n';

只有在我們想儲存一些其他相關資訊的時候,才需要留意 time() 的參數,以目前的使用情境傳入 0 就可以了。


設定亂數的範圍

有時候我們希望產生的亂數介於某個區間內,比如說,隨機產生一個介於 0 到 10 的整數。可以利用 % 運算子來達到這樣的目的:

srand(time(0));
for (int i = 0; i < 10; ++i)
cout << rand() % 11 << '\n';

注意: 因為 % 是取餘數的意思,所以如果希望隨機產生的數中有可能包含 10,那就要對 11 取餘數,而不是 10。

如果希望產生一個 1 ~ 10的整數的話,則是:

cout << rand() % 10 + 1 << '\n';

透過把餘數加 1,可以讓亂數的最小值從 1 開始。而為了讓最大值是 10,我們需要對 10 取餘數,因為 rand() % 10 的最大值為 9,加上 1 就剛好是 10。

透過上面的例子可以知道,我們可以利用取餘數的對象 (m)要把結果再加多少 (n) 這兩個數字來設定亂數的範圍:

rand() % m + n;

因為 % m 可能的結果為 0 ~ m-1,所以亂數範圍的"長度"為 m,也就是說,假設我們希望隨機產生介於 p ~ q 的亂數的話,m 要等於 (q - p + 1)。而 n 則等於 (p - 0),因為取餘數可能得到的最小值為 0。

利用這個公式,就可以輕鬆設定我們想要的亂數範圍。

範例: 隨機產生介於 -5 ~ 12 的整數

cout << rand() % 18 - 5 << '\n';








分享至
成為作者繼續創作的動力吧!
歡迎討論學習 C++ 遇到的問題
© 2024 vocus All rights reserved.