為什麼每次執行rand的結果都一樣

2021-09-10 18:23:23 字數 3460 閱讀 3954

1樓:匿名使用者

#include

...srand(time(0));

rand();

--------------

上述**每秒變一次,如果想每1/1000000秒變一次,加分!!!!

2樓:格里程式設計辦公技巧

在使用rand前加randomize();

3樓:青鳥中關村專家

rand函式不是真正的隨機數生成器,而srand()會設定供rand()使用的隨機數種子。如果你在第一次呼叫rand()之前沒有呼叫srand(),那麼系統會為你自動呼叫srand()。而使用同種子相同的數呼叫 rand()會導致相同的隨機數序列被生成。

srand((unsigned)time(null))則使用系統定時/計數器的值作為隨機種子。每個種子對應一組根據演算法預先生成的隨機數,所以,在相同的平臺環境下,不同時間產生的隨機數會是不同的,相應的,若將srand(unsigned)time(null)改為srand(tp)(tp為任一常量),則無論何時執行、執行多少次得到的「隨機數」都會是一組固定的序列,因此srand生成的隨機數是偽隨機數。

庫函式中系統提供了兩個函式用於產生隨機數:srand()和rand()。 原型為:

函式一:int rand(void);

返回一個[0,rand_max]間的隨機整數。

函式二:void srand(unsigned seed);

引數seed是rand()的種子,用來初始化rand()的起始值。

但是,要注意的是所謂的「偽隨機數」指的並不是假的隨機數。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生 成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。

比如「世上沒有兩片形狀完全相同的樹葉」,這體現到了事物的特性 —— 差異性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。

系統在呼叫rand()之前都會自動呼叫srand(),如果使用者在rand()之前曾呼叫過srand()給引數seed指定了一個值,那麼 rand()就會將seed的值作為產生偽隨機數的初始值;而如果使用者在rand()前沒有呼叫過srand(),那麼系統預設將1作為偽隨機數的初始 值。如果給了一個定值,那麼每次rand()產生的隨機數序列都是一樣的

所以為了避免上述情況的發生我們通常用srand((unsigned)time(0))或者srand((unsigned)time(null))來 產生種子。如果仍然覺得時間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(null)後面乘上某個合適的整數。

c語言裡用rand為什麼每次執行總是產生一樣的隨機數

4樓:鈔成勢瑞

需要首先使用隨機數「種子」初始化,srand函式:

#include

#include

#include

//使用當前時鐘做種子

void

main(

void)

真隨機數的定義是什麼

5樓:匿名使用者

從軟體的角度來說,如果是計算機起卦,則要用到隨

6樓:春風化雨時

隨機數是專門的隨機試驗的結果。

在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中,或者在進行蒙特卡羅模擬法計算的時候等等。

產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關係。

真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。

在實際應用中往往使用偽隨機數就足夠了。這些數列是「似乎」隨機的數,實際上它們是通過一個固定的、可以重複的計算方法產生的。計算機或計算器產生的隨機數有很長的週期性。

它們不真正地隨機,因為它們實際上是可以計算出來的,但是它們具有類似於隨機數的統計特徵。這樣的發生器叫做偽隨機數發生器。

在真正關鍵性的應用中,比如在密碼學中,人們一般使用真正的隨機數。

7樓:

真隨機數一般都是相對於陣列而言,真隨機數就是沒有規律的數,你不能預見其下一個數值是多少,真隨機數是個詭異的東西,一個源於物理現象得到的真隨機陣列一經公開就不再是真隨機陣列了,因為得到陣列的人都可以知道下一個數是什麼。

以往大家有個共識,就是計算機不能產生真隨機數,其實這是對計算機認識不夠造成的,計算機有多種產生隨機數的方法,這裡僅舉一例:

最常用的c語言中有些函式的特點是每次呼叫它執行時間不一樣,也就是執行時間有一定的隨機性,利用此特性我們可以得到所需要的隨機數。這些函式有beep(0,0),setwindowtext(null),messagebeep(mb_iconquestion)等,其它語言的函式也有類似情況是肯定的。

我們只要連續呼叫此類函式,監測其執行時間,處理執行時間就可以達到目的。但函式的執行時間都是很短暫的,用一般測量時間的方法都太粗糙了,必須自己設計度量方法。每個計算機都有其工作頻率稱為主頻,與之相對應的是時鐘週期,做一個函式讀取計算機執行以來的時鐘週期,用函式執行時計算機所經歷的週期數來度量時間;測量一下當前的週期數,讓函式執行,再測量一下當前的週期數,兩個週期數的差值再減去一個本底值就代表了函式執行時間,如此做多個迴圈就可以大量採集執行時間了,處理執行時間陣列得到隨機陣列。

且看實驗資料:

beep(0,0)函式的執行時間115636,114283,114899,115030,114488,114350,114866,115132,114317,114757

放在字陣列裡則有  50100,48747,49363,49494,48952,48814,49330,49596,48781,49221

放在位元組陣列裡則有 180,107,211,86,56,174,178,188,141,69

顯然放到16位的字陣列裡效果不好,這是因為函式執行時間只比16位的最大值大0.7倍左右。但放到8位陣列裡效果不錯,而其它位數的資料由此組合即可。

通過生成大量資料的檢測還沒有發現週期現象,也就是從不重複的,陣列長度大時所有元素等概率出現隨機性良好,所以它們是真隨機數。

這裡展示了程式連續生成大隨機數:http://clip2net.com/s/1dphz

c++中rand()%100在每次執行時所給的隨機數都是41,如何每次執行得到不同的隨機數?

8樓:匿名使用者

#include #include #include

using namespace std;

void main()}}

9樓:匿名使用者

在呼叫rand前 呼叫一下srand(time(0));

下面是matlab程式,為什麼執行結果不是正確的結果,正確的結果應該是y 138 這是為什麼啊?求高手解答

fid fopen temp.txt wb 把wt換成wb,以和rb對應,或者都改成wt,總之要對應 這個問題與主要和文字檔案的編碼有關,具體的我也不是很清楚,裡面應該是很複雜的,何況還有數值溢位的問題和matlab函式的內部執行機制有關。wt中的t表示文字檔案是ansi編碼,儲存時存的是字元的ac...

為什麼我老公每次和別人吵架都吵不贏?,每次都是他認輸。。不管和男的女的吵都是這樣吵一會兒他就

不是他不吵不贏,有句話說的是贏了口才輸了人才,你老公比任何人都重視這份感情,畢竟感情來之不易。第一 可能是懦弱 第二 大度的不行 第三 內向 不知道怎麼吵 第四 他不希望跟別人把關係搞僵 不是他吵不贏你,每次是他讓著你,愛你,他希望保持一個美好的家庭 不是吵不贏!是感覺沒意思!不值得 估計是不想起爭...

為什麼電腦每次啟動都硬碟自檢的

是硬碟有物理壞道在不斷產生,用效率源或相應的修復軟體修理,不可用低格軟體低格,會導致壞區擴大的後果。對於開機自檢的分割槽可使用windows自帶的磁碟掃描程式修復。右鍵單擊磁碟,在彈出的選單選擇屬性 工具 查錯 開始檢查 磁碟檢查 選項中勾選 自動修復檔案系統錯誤 掃描並嘗試恢復壞扇區 接著是等待或...