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

時間 2021-09-10 18:23:31

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));

下面程式的執行結果是為什麼,程式的執行結果是 ?

楊兵 執行結果 147 include void main 1 4 7 i 先進行加1操作,然後再判斷i是否符合要求 程式的執行結果是 聽不清啊 因為 i是i先自增後再取i的值,而j 是先取j的值,然後再j 自減。所以,程式的輸出是 9,9,9,10 輸出9,9,9,10 下面程式的執行結果是 a葰...

下面程式的執行結果是什麼?為什麼

南睿薇 二10 20 d類是從b類和c類派生的,而b類和c類又都是從類派生的,但各有自己的副本。所以對於物件d,d.b n與d.c n是兩個不同的資料成員,互無聯絡。所以程式結果為 10,20三35 4523b d 3,5 呼叫建構函式b int,int a int 得到x 3 y 5 d.disp...

為什麼我執行C語言後,顯示不到結果

最後一個花括號前加上 system pause c語言程式可以執行,但不顯示結果 while m 1 這個是不是有問題,如果是判斷m等於1,應該是m 1 這個是賦值語句。無縮排 無註釋 無空格 不答不解釋 也要先說說你的程式是想要完成什麼功能,這樣看起來比較方便啊 給點註解之類的吧 實在不懂什麼意思...