計算機的隨機數都是由偽隨機數。例如: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 方法對數字進行四捨五入,向上取整...