C++ rand 與 srand 的用法

2021-03-01 編程範

計算機的隨機數都是由偽隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子。(注意:小M多項式序列的周期是65535,即每次利用一個隨機種子生成的隨機數的周期是65535,當你取得65535個隨機數後它們又重複出現了。)

我們知道 rand() 函數可以用來產生隨機數,但是這不是真正意義上的隨機數,是一個偽隨機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公布,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。

功能:

隨機數發生器

用法:

所在頭文件:

rand() 的內部實現是用線性同餘法做的,它不是真的隨機數,因其周期特別長,故在一定的範圍裡可看成是隨機的。

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

用戶未設定隨機數種子時,系統默認的隨機數種子為 1。

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

功能:

初始化隨機數發生器

用法:

所在頭文件:

srand() 用來設置 rand() 產生隨機數時的隨機數種子。參數 seed 必須是個整數,如果每次 seed 都設相同值,rand() 所產生的隨機數值每次就會一樣。

rand() 產生的隨機數在每次運行的時候都是與上一次相同的。若要不同, 用函數 srand() 初始化它。可以利用 srand((unsigned int)(time(NULL)) 的方法,產生不同的隨機數種子,因為每一次運行程序的時間是不同的。

1) 給srand()提供一個種子,它是一個unsigned int類型;

2) 調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到RAND_MAX之間);

3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;

4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步"隨機化"rand()的輸出結果。

0~RAND_MAX 之間的隨機數程序

要取得 [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)。

Dotcpp接受發表各大OJ題解


重點用戶還會有禮品相送~


歡迎搜索c語言網 

https://www.dotcpp.com/

相關焦點

  • 單片機隨機數:rand(),srand()
    srand()就是給rand()提供種子seed如果srand每次輸入的數值是一樣的,那麼每次運行產生的隨機數也是一樣的,srand(n)for(10)rand()也就是說,以一個固定的數值作為種子是一個缺點。
  • Perl數學函數用法大全
    Perl數學函數用法大全 Perl語言中有多種Perl函數,有Perl進程控制函數,字符串處理函數等,這裡向大家簡單介紹一下Perl數學函數的用法,希望本文的介紹能讓你有所收穫。
  • 「Excel技巧」有了隨機函數rand和randbetween函數,想隨機就隨機
    語法結構:=RAND()現在看看rand怎麼生成0~1之間的隨機數,如下:現在再看看rand怎麼生成1~10的隨機整數,公式:=ROUND(RAND()*10,0)如下圖:不過話說,生成1~10的隨機整數,這裡還有一個函數更直接,那就是RANDBETWEEN函數。
  • Word中使用RAND函數有什麼作用?如何自動生成隨機文本?
    我們都知道在Excel中會經常用到RAND函數,它可以生成隨機數,用法可見下文。Excel生成隨機數函數RAND和RANDBETWEEN那麼在Word中也能用RAND函數嗎?一、基本語法基本語法為=rand(段落數,每段句數),注意要在英文狀態下輸入。意思是按照指定的段落數和每段句數生成隨機文本。比如要生成6段文字、每段包含3句話,則輸入=rand(6,3),按下回車,結果如下圖所示。
  • 隨機函數:RAND&RANDBETWEEN
    寫法:=rand()示例:①利用rand函數隨機排序。Randbetween函數作用:生成bottom~top之間的隨機整數(bottom≤隨機數≤top)寫法:=randbetween
  • 「RAND」函數(隨機生成數值)和「求和」選項
    好了,接下來就開始我們今天的分享吧,示例和操作如下圖:操作部分:第一項:RAND函數操作一:隨機生成0-1之間的數據直接在空白區域內輸入「=rand()」就可以。如下圖注意:(1)空白區域的單元格格式不能是文本或其他非法格式(2)輸入公式時,需是在英文字符下。
  • 三種基本用法、五種應用場景,理清C++11新特性:Lambda表達式
    為了能夠輕鬆閱讀代碼,進而熟練地使用,本文首先將講解lambda表達式的基本語法、三種基本用法,然後介紹五種實際的應用場景,最有總結說明lambda表達式的作用。表達式語法首先看下lambda表達式的基本語法,它由五部分組成,分別為捕捉列表,參數列表,修飾符,返回類型和函數體。
  • RAND()函數和TIME()函數,隨機事件的偶然發生及實現的可能過程
    先看看最後實現的公式:=time(8,int(121*rand(),0)思路分析:因為RAND函數產生的數值的區間是大於等於0,小於1的隨機小數,所以INT(121*RAND())得到的結果為大於或等於0小於或等於120的整數,這樣才能保證time(8,int(121*rand(),0)在8點到10點之間.
  • EXCEL表中快速將數據隨機打亂順序(隨機函數rand應用)
    這裡介紹一個簡單以用的隨即排序方法,詳見下圖上圖是按學號排列的數據,現在我們要安排座位或者考場排列 需要打亂順序,操作如下在右邊插入輔助列,C3寫公式 =rand(),回車然後往下複製單元格,然後選中數據區,點excel上方工具面板 【數據】–【篩選】 然後點C烈小三角 升序即可
  • C++的轉換手段並與explicit關鍵詞配合使用
    ++作者:良知猶存轉載授權以及圍觀:歡迎添加微信公眾號:羽林君隱式轉化c++語言不會直接將兩個不同類型的值相加,二十先根據類型轉化規則設法將運算對象的類型統一後再求值。例如 int value = 3.14 +3;這個程序是可以編譯通過的,只不過編譯器可能會警告改運算損失了精度。
  • 基於Matlab和Visual C++的數字濾波器設計方法
    濾波器相關文章:濾波器原理 濾波器相關文章:濾波器原理 c+++相關文章:c++教程 低通濾波器相關文章:低通濾波器原理 電源濾波器相關文章:電源濾波器原理
  • 【C++】C++獲取系統日期時間
    printf("%d\n",p->tm_yday); /*從今年1月1日算起至今的天數,範圍為0-365*/}原文:https://blog.csdn.net/u012229282/article/details/79598287  C++時間問題(其中有一些bug)  【轉】2009-10-05 16:20:32|  分類: c++