一文帶你讀懂生成隨機數的方式?

2021-10-04 17:19:02 字數 3818 閱讀 4819

計算機的隨機數都是由偽隨機數。例如:rand() 函式可以用來產生隨機數,但是這不是真正意義上的隨機數,是乙個偽隨機數。那麼我們來看看**中有哪些方式可以生成隨機數。

rand

函式宣告如下:

#include

intrand

(void

);

rand() 返回一隨機數值的範圍在 0 至 rand_max 間。rand_max 的範圍最少是在 32767 之間(int)。用 unsigned int 雙位元組是 65535,四位元組是 4294967295 的整數範圍。0~rand_max 每個數字被選中的機率是相同的。

rand()的用法

如果你要產生0~10的10個整數,可以表達為:

int n =

rand()

%11;

如果要產生1~10,則是這樣:

int n =1+

rand()

%10;

總結來說,可以表示為:

a +

rand()

% n

先來個例子看看:

#include

#include

// rand

intmain

(int argc,

char

const

*ar**)

printf

("\n");

return0;

}

編譯輸出:

是不是覺得很奇怪,每次執行,數值都是一樣的。有些朋友會問?這怎麼都是一樣的呢!還玩個毛線。。。 請勿急躁。

rand() 產生的是偽隨機數字,每次執行時是相同的; 若要不同, 用函式 srand() 初始化它。

srand

rand() 產生的隨機數在每次執行的時候都是與上一次相同的。若要不同, 用函式 srand() 初始化它。

函式宣告如下:

#include

void

srand

(unsigned

int seed)

;

可以利用 srand((unsigned int)(time(null)) 的方法,產生不同的隨機數種子,因為每一次執行程式的時間是不同的。確保種子不一樣,因此通常會選擇使用時間作為種子。

再對之前的**進行修改,利用srand給它乙個種子:

#include

#include

// rand

#include

intmain

(int argc,

char

const

*ar**)

printf

("\n");

return0;

}

編譯輸出:

現在好了,每次執行生成的都不一樣了。但是還有乙個問題,如果這種方式在多執行緒下使用,也是不可取的,因為rand不是可重入函式。

rand_r

函式宣告:

#include

intrand_r

(unsigned

int*seedp)

;

想要在多執行緒中使用隨機數,,可以使用rand_r,使用方式和rand是一樣的,還是上面的例子:

#include

#include

// rand

#include

intmain

(int argc,

char

const

*ar**)

printf

("\n");

return0;

}

編譯輸出:

產生不同的隨機數種子,因為每一次執行程式的時間是不同的。

思考乙個問題:

在多執行緒中,如果多個執行緒同時呼叫,那它們的種子可能也一樣?怎麼解決呢!

如果想不一樣,還可以將種子設定成和執行緒id有關。例如:

unsigned

int seed =

time

(null)^

pthread_self()

;

pthread_self需要包含標頭檔案 #include

random

rand生成的整數範圍是有限的,為了生成更大範圍,可以使用random。

random宣告如下:

#include

long

random

(void);

void

srandom

(unsigned

int seed)

;

random返回的型別為long,因此在一定程度上,它生成的範圍要大得多。另外與rand類似,需要使用srandom函式設定種子。

#include

#include

// rand

#include

intmain

(int argc,

char

const

*ar**)

printf

("\n");

return0;

}

產生一定範圍隨機數的通用表示公式要取得 [a,b) 的隨機整數,使用 (rand() % (b-a))+ a;

要取得 [a,b] 的隨機整數,使用 (rand() % (b-a+1))+ a;

要取得 (a,b] 的隨機整數,使用 (rand() % (b-a))+ a + 1;

通用公式: a + rand() % n;其中的 a 是起始值,n 是整數的範圍。

要取得 a 到 b 之間的隨機整數,另一種表示:a + (int)b * rand() / (rand_max + 1)。

要取得 0~1 之間的浮點數,可以使用 rand() / double(rand_max)。

來個簡單舉例:

要取得 [a,b) 的隨機整數,使用 (rand() % (b-a))+ a;

#include

#include

// rand

#include

intmain

(int argc,

char

const

*ar**)

printf

("\n");

return0;

}

總結計算機的隨機數都是由偽隨機數。通過上面介紹的這些方法生成的都是偽隨機數。本文所介紹的僅僅是庫函式提供的隨機數生成函式。如果想它的隨機性很強,可能需要根據使用場景去設計具體的演算法了。

一文帶你讀懂「TRIZ」

各位好,本期的內容是 triz與經典triz 在開始之前,請您先嘗試回答以下問題 什麼是triz?什麼是 經典triz 經典triz 包括哪些內容?經典triz 與 現代triz 的區別?您可以先思考一會兒。好了,不知您回答對了幾道題呢?為什麼要學習本課程?學習本課程,你可以獲得哪些知識?在此,我要...

獨家 一文帶你讀懂特徵工程!

無論它的規模和大小如何,資料已經成為現代企業 公司和組織的一流資產。任何乙個智慧型系統都需要資料驅動,無論它多複雜。每個智慧型系統的核心,均有乙個或多個基於某種資料學習方法的演算法,例如機器學習 深度學習或統計方法,它們利用這些資料來生成知識,並在一段時間內提供智慧型洞察。演算法本身是非常通用的,但...

生成隨機數 js生成隨機數的方法

這幾天一直在研究前台div元素的隨機定位的問題,而這裡面涉及到了js生成隨機數的方法,就下功能研究了一翻,並整理了一些資料以防以後再用得到。在js中可以使用 math 對像來實現隨機數的生成,但是這個對像有幾個方法,先了解一下 1 js中的 ceil 方法 ceil 方法對數字進行四捨五入,向上取整...