vocus logo

方格子 vocus

無痛入手 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';








留言
avatar-img
鏟薯員的窩
9會員
14內容數
程式設計 & 電腦系統 & 系統軟體
你可能也想看
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
C#是一種開源、跨平台、面向對象的編程語言,具有類型安全、泛型、模式匹配等特性。廣泛應用於桌面和Web應用程序、遊戲開發、移動應用、雲計算等領域。全球數十萬家公司像微軟、Unity Technologies、Stack Overflow等使用C#支持其業務。C#還提供豐富的進階學習資源和主題。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
Thumbnail
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
本章節旨在介紹 C# 中函數的基本結構,包括訪問修飾符、返回類型、方法名稱、參數列表和方法體。同時,也介紹了函數的各種呼叫方式、參數傳遞方式和返回值類型。讀者可以通過本章節,深入理解 C# 中函數的使用和應用。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
C#程式由一或多個檔案組成,包含命名空間、類別、結構、介面、列舉和委派等型別。Main方法是C#應用程式的進入點。在C#中,註解用於在程式碼中添加說明,有單行和多行兩種類型。變數的定義需要指定變數的類型和名稱,可以一次為多個變數賦值。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News