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

閱讀時間約 4 分鐘

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';








2會員
14內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
[C++基礎]迴圈loop介紹 for ,while ,do whilefor,while,do while語法介紹 for loop for比較偏向固定圈數型的迴圈 語法 for(計數變數初值; 布林運算式 ; 增量運算) { : 一般指令; : }
Thumbnail
avatar
螃蟹_crab
2024-01-04
[C++基礎]巢狀迴圈For loop巢狀迴圈For loop介紹結構及範例說明 巢狀迴圈 巢狀迴圈是在一個迴圈內包含另一個迴圈的結構 簡單來說,就是內迴圈做完,才會在跑到外迴圈,接著在做內迴圈
Thumbnail
avatar
螃蟹_crab
2024-01-04
[C++]基礎,條件選擇結構IF,Switch,三元運算子IF,Switch,三元運算子語法說明 IF條件選擇結構說明 IF為布林條件,當()內條件式滿足True執行if區塊的程式碼,不滿足則執行else區塊的程式碼,若無else也行。
Thumbnail
avatar
螃蟹_crab
2024-01-03
[C++]基礎介紹,架構說明介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
avatar
螃蟹_crab
2024-01-02
C++基礎練習 bmi的計算 BMI的公式為 體重(公斤)/((身高(公尺))^2) (註:^是次方的意思) 這個問題有用到平方的計算, 如果我要將一個數字平方,在c++時可以怎麼用呢? 1.使用pow函數 pow(參數1,參數2) 參數一代表的是底數,參數2代表的是指數 pow(x,y)=
avatar
珮婕蕭
2023-11-12
C++基礎基礎練習 怎麼做三個數的相乘以及 怎麼算三個數的平均數 include<iostream>(一樣引入背景需要的設置,是寫c++時開頭必加的一行) using namespace std;(這樣做能讓我們不需要每一行的開頭都加std::,如果沒有使用這個功能,打cout就要變成std::co
avatar
珮婕蕭
2023-11-12
c++基礎練習 兩個數字的加總 c++ (註:\\代表是註解的意思,解釋每行程式碼的意思,不用打入程式當中)) include<iostream>(引入背景需要的功能) Using namespace std;(這個功能可以幫助我們取代std::,就不用每行都加個std) int main( ){
avatar
珮婕蕭
2023-11-11
C++ 新手教學目錄C++新手教學目錄
Thumbnail
avatar
匿名李
2021-10-09
C++ 新手教學12後續 (第二章完結)這是一個新手寫給新手的新手教學
Thumbnail
avatar
匿名李
2021-10-09
C++ 新手教學12break、continue、更進一步的for迴圈、while迴圈、switch
Thumbnail
avatar
匿名李
2021-10-09