簡體   English   中英

在C ++中查詢rand()函數

[英]Query on rand() function in C++

我對C ++中的rand()函數用法有2個查詢:

  1. rand()函數在哪里定義? 我寫了一個簡單的程序cout<<rand()<<endl; 循環中,除了<iostream>之外,我沒有包含任何頭文件。 在我在幾個站點遇到的參考示例中,有的說,您需要包含<stdlib.h> ,有的說, <time.h> ..所以想知道我的程序是如何工作的。
  2. 我在使用“ rand()”之前曾聽說過,需要通過給srand種子來初始化,通常種子是當前的unix時間-> srand(time(NULL)) ..但是,我也沒有這樣做僅包含cout<<rand()<<endl;簡單程序cout<<rand()<<endl; 在一個while循環中,它顯示隨機數。.那么問題: srand(time(NULL))用於改善隨機性,因為它不是強制性的? 如果不是,使用它的目的可能是什么。

感謝你的幫助!

謝謝!

<cstdlib>標頭中聲明。 標准庫頭(在您的示例中為<iostream>可能包括其他標准頭,但是您不應依賴於它,因為它是實現特定的。 明確包含您需要的標題。

除非必須對每次運行程序都會產生相同的“隨機”序列感到滿意,否則必須為隨機數生成器設置種子。

rand()函數在stdlib.h中聲明,因此您需要在程序中包含#include <stdlib.h> 您可能還需要#include time.h因為在那里聲明了time()函數,該函數用於初始化帶有以下內容的隨機種子:

srand (time(NULL));

如果希望每次運行程序時rand()產生(不同的)偽隨機序列,則必須完成初始化種子的操作

http://en.cppreference.com/w/cpp/numeric/random/rand

rand()在標准庫中定義。 它在頭文件<stdlib.h><cstdlib> 首先,它在全局名稱空間中; 在第二個名稱空間std 您應該#include程序使用的所有標准庫元素的適當標題; 有時,這些名稱也會在其他標頭中聲明,但這純粹是實現的內部內容。

至於播種,如果您自己不播種生成器,則會獲得默認種子,每次運行該程序時該種子都是相同的,就像調用srand(1) 每次運行程序時,您將從rand()獲得相同的數字序列。 這對於調試很有用,但是,當應用程序在現實世界中存在時,當然沒有用。 要產生不同的隨機數序列,請在程序啟動時調用srand ,並在每次調用時為其賦予不同的值。 這就是stand(time(NULL))所做的。

我將解決以下問題:

1) rand()函數在stdlib定義,您可以在此處閱讀。 srand函數的time被引用為time(NULL)

2) srand() -使用作為種子傳遞的參數初始化偽隨機數生成器。

對於調用srand使用的每個不同種子值,可以期望偽隨機數生成器在隨后的rand調用中生成不同的結果序列。

具有相同種子的兩個不同初始化將在隨后的rand調用中生成相同的結果序列。

如果將seed設置為1,則生成器將重新初始化為其初始值,並產生與調用randsrand之前相同的值。

為了生成類似隨機數的數字,通常將srand初始化為一些與眾不同的運行時值,例如函數time返回的值(在標頭<ctime>聲明)。 對於大多數瑣碎的隨機化需求而言,這足夠獨特。

  1. 它包含在cstdlib

    iostream可能已包含此標准頭

  2. 您是否重新運行了程序,並注意到上次運行生成的數字之間存在任何共同點。

    是的!,所以, srand是您所需要的,它將當前時間作為隨機數生成器的種子。

如果您閱讀了手冊頁-http://linux.die.net/man/3/rand-它會告訴您它的種子自動為1。 至於為什么不需要包含stdlib ,則必須包含在iostream的腸子中

rand()函數在哪里定義?

它包含在c標准庫<stdlib.h> ,而<cstdlib><stdlib.h> c ++包裝。 如果需要time()函數,請記住也要包含<time.h>

srand(time(NULL))是否用於改善隨機性,因為它不是強制性的?

在大多數情況下,它不是強制性的。 由於rand()不會生成真正的隨機數,而是生成偽隨機數,其中生成過程取決於種子或初始值。

因此,如果您需要與上一個序列號不同的序列號,則需要設置一個不同的種子,否則程序的每次執行都會生成相同的序列號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM