c++中沒有自帶的random函式,要生成隨機數就需要用c檔案"stdlib.h"裡的函式rand()和srand(),不過,由於rand()的內部實現是用線性同餘法做的,
所以生成的並不是真正的隨機數,而是在一定範圍內可看為隨機的偽隨機數,下面分別介紹一下各自的用法
1. int rand(void);它是無參函式,返回int型資料,並且返回值範圍是 0~rand_max(32767),rand_max定義在標頭檔案 中,是乙個8位數;
rand()的作用是用來產生隨機數序列的,它產生的隨機數是根據種子生成的,不同的種子產生的隨機序列也是不同的;而系統預設的種子是1,如果
你沒有設定種子的話,那每次使用rand()產生的隨機序列都是固定的,它會產生相同的隨機序列,所以這不是真正的隨機,而是偽隨機數,要做到真正
的隨機,就要使種子隨機。下面先說一下rand()的用法,後面再說怎麼設定隨機種子,上**
#include#include我執行了兩次程式,分別產生了兩個隨機序列,如圖#include
using
namespace
std;
intmain()
你會發現兩次所生成的隨機序列是相同的,這是為啥 ?上面說過系統預設的種子是1,而你又沒有設定隨機種子,所以每次產生的隨機序列都是一樣的,是偽隨機。
如何解決這個偽隨機的問題呢,這就引出了srand()。
2. void srand(unsigned int seed);srand()就是用來設定rand()函式的種子的,若srand()每次設定的種子不同,那麼rand()就會產生不同的隨機序列。一般用時間來
做種子,因為時間一直在變,這樣種子就會不同,從而可以產生真正的隨機數。方法為將函式time(0)作為srand()的引數(因為time會有返回值,實際上是讓這個返回值做引數),
另外srand(time(0))只需要執行一次就行了。具體操作還是看**吧
#include#include還是執行了兩次程式,分別產生了兩個隨機序列,結果如下圖#include
using
namespace
std;
intmain()
那你會發現這兩次產生的兩個隨機序列是不一樣的,因為用了時間做種子。下面還有乙個小問題,就是如果要產生某個範圍內的隨機數要怎麼實現呢,比如
要產生[0,100)這個範圍內的隨機數,或者[0,10000)這個範圍內的隨機數,就要用rand()%n來產生[0,n)這個範圍內的隨機數了。用rand()%(b-a)+a 來產生[a,b)
這一範圍內的隨機數,下面用程式分別模擬一下這三種情況:
#include#include結果如下圖:#include
using
namespace
std;
intmain()
通過上面的操作就可以產生指定範圍內的隨機數了。
產生一定範圍內的隨機數的公式是:
要產生 [0,n) 內的隨機數,用 rand()%n
要產生 [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~n之間的隨機數。
參考:
產生隨機數函式
1.system.currenttimemillis 2.math.random 返回乙個隨機雙精度值d,如 0.0 d 1.0 一般地,a math.random b 返回 a 到 a b 之間的隨機數,不包括 a b 3.生成任意兩個字元 ch1 和 ch2 ch1 ch2 之間的隨機字元 ch...
c 隨機數產生
我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.net framework中提供了乙個專門用來產生隨機數的類system.random。對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結...
C 隨機數產生
標準庫 被包含於中 提供兩個幫助生成偽隨機數的函式 函式一 int rand void 從srand seed 中指定的seed開始,返回乙個 seed,rand max 0x7fff 間的隨機整數。函式二 void srand unsigned seed 引數seed是rand 的種子,用來初始化...