rand隨機函式是什麼原理,rand隨機函式是什麼原理

2021-03-03 22:10:31 字數 3673 閱讀 5457

1樓:

rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統,為了改變這個種子的值,c提供了 srand()函式,它的原形是void srand( int a) 功能是初始化隨機產生器既rand()函式的初始值,即使把種子的值改成a; 從這你可以看到通過sand()函式,我們是可以產生可以預見的隨機序列,那我們如何才能產生不可預見的隨機序列呢?我們可能常常需要這樣的隨機序列,利用srand((unsign)(time(null))是一種方法。

計算機語言中,隨機函式原理是什麼?

2樓:答題狂魔想升級

在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,實現這一功能的程式叫偽隨機數發生器。

不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數暫存器或移位暫存器來生成的。

下面是c語言裡所提供的隨機數發生器的用法。現在的c編譯器都提供了一個基於ansi標準的偽隨機數發生器函式,用來生成隨機數。它們就是rand()和srand()函式。

這二個函式的工作過程如下:

【1】首先給srand()提供一個種子,它是一個unsigned int型別,其取值範圍從0~65535;

【2】然後呼叫rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間);

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

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

3樓:匿名使用者

計算機不會產生絕對隨機的隨機數,計算機只能產生「偽隨機數」。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。

偽隨機數並不是假隨機數,這裡的「偽」是有規律的意思,就是計算機產生的偽隨機數既是隨機的又是有規律的。怎樣理解呢?產生的偽隨機數有時遵守一定的規律,有時不遵守任何規律;偽隨機數有一部分遵守一定的規律;另一部分不遵守任何規律。

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

隨機函式有如下兩種:

rand()函式返回0到rand_max之間的偽隨機數(pseudorandom)。rand_max常量被定義在stdlib.h標頭檔案中。其值等於32767,或者更大。

srand()函式使用自變數n作為種子,用來初始化隨機數產生器。只要把相同的種子傳入srand(),然後呼叫rand()時,就會產生相同的隨機數序列。因此,我們可以把時間作為srand()函式的種子,就可以避免重複的發生。

如果,呼叫rand()之前沒有先呼叫srand(),就和事先呼叫srand(1)所產生的結果一樣。

4樓:匿名使用者

很少有裝置擁有隨機電路,除非安全性要求很高,大部分隨機發生函式採用線性同餘產生0到p-1之間的均勻分佈,通常用

隨機種子s=(a*s+b) mod p進行迭代,函式輸出為s^c mod p,其中a, b, c互質,p為質數,s由系統時間等方式初始化;由輸出猜測隨機種子是一個離散對數方程,很難解,因此安全性較好。

5樓:匿名使用者

我只知道c是以秒為單位讀取計算機內部時間 然後用srand()函式生成種子,在此種子下產生偽隨機數,也就是隻要種子不同,所產生的資料就不同,以此達到產生隨機數的目的

rand()函式產生的隨機數為什麼是偽隨機數

6樓:匿名使用者

計算機的執行過程是一個

確定的過程,每一條指令都是確定,因此從根本上來講,計算機產生不了真正意義上的隨機數。

那麼偽隨機數怎麼理解呢?舉個最簡單的例子,要隨機產生0~9十個數,那麼計算機可以迴圈快速的給出0、1、2、3、4、5、6、7、8、9、0、1……這樣的一個數列,這個數列並不是隨機的,而是有規律的(所以才叫做偽隨機),當我們按下按鈕,或者點下滑鼠的瞬間,機器停止,並顯示最後的一個數字(有點類似於玩***),這個過程我們挑選出來的數字好像是隨機的,但其實並不是100%隨機,只有我們去觸發機器的那個時間點是隨機的,其他都是有規律的,所以就是偽隨機。

rand()函式就是給出一列數值(這列數值是被事先打亂,但是是固定的數值),所以屬於偽隨機數。只是機器執行到rand()函式的時間點是隨機的,才讓我們感覺執行結果是隨機的一樣。

rand()隨機函式產生的值的範圍?

7樓:匿名使用者

cplusplus中有這樣的介紹:

rand函式產生一個0到rand_max的偽隨機數,這裡的rand_max因不同的實現而異,但rand_max至少為32767。(比如,msvc中通常為0x7fff,即32767,而linux平臺下gcc中rand_max通常會遠遠大於這個值)

有一些其他程式語言的rand函式確實是產生一個[0.0, 1.0)之間的浮點數。比如matlab。

在c中,

rand() % 32會產生一個[0, 32)之間的偽隨機數,那麼rand() % 32 + 1的取值區間實際上是[1, 33)。

要產生[0, 32)(開區間)之間偽隨機數:

rand() % 32即可;

要產生[0, 32](閉區間)之間偽隨機數:

rand() % 33即可。

8樓:好嘞啊啊啊啊

看返回值的型別

unsigned int

雙位元組是65535,

四位元組是4294967295的整數範圍。

rand()函式是一個有返回值的函式

rand()%32 是0-31

如果加一的話

就是1-32

9樓:

0~32767。

產生0-32之間的某個隨機數的**是rand()%33,不是rand()%32+1。rand()%32+1產生1~32之間的隨機數!

10樓:匿名使用者

看函式原型: int rand(void),可見其返回的是一個32位的數,準確的來說是無符號的

範圍為 0~4g-1。要想取得某一範圍的值用取餘的方式再加一個基值即可。

11樓:匿名使用者

mayadong7349說的是正解,我就是來支援正解的不要採納我

12樓:

產生0-32之間的隨機數是有這些方法:

rand()%32+0

rand()%(32-0+1)+0

rand()%33

13樓:

win下是16位,linux下是32位。

具體說就是0~2^15-1,0~2^31-1。

14樓:匿名使用者

srand((int)time(0));

1 + 100*rand() % 32

材質RA母與數字的含義是什麼,材質RA330字母與數字的含義是什麼

ra330能耐滲碳,易滲氮,在1035度以下反覆加熱。一 ra330對應牌號 1 國標gb t標準 數字牌號 s33010 新牌號 12cr16ni35 舊牌號 1cr16ni35,2 美標 astma標準 一 sae標準 一,uns標準 mt 330,3 日標jis標準 suh330,4 德標di...

這是什麼原理,這是什麼原理?

這是普通感冒的典型症狀表現。一般的感冒,其症狀表現為咽乾 咽癢 打噴嚏 鼻塞 咳嗽 流眼淚 頭痛 肌肉痠痛等,如患者有鼻子一酸就流眼淚的症狀,這一般在感冒的2 3天表現出現,而且多半為哪邊鼻子流鼻涕發酸,同樣一邊的眼睛也會隨著有流淚現象,這是因感冒引起鼻黏膜充血 水腫以及鼻內分泌物過多導致鼻腔內一端...

染頭髮是什麼原理,染髮是什麼原理

染頭髮是利用植物的 如油梨果 指甲草 何首烏等 或者化學的色素,把頭髮的顏色染成想要的顏色。染髮注意事項 染髮前一定要做 斑貼測試,即在手腕或耳後小面積塗抹染髮劑,24小時後無紅腫 刺痛等過敏反應再染。染髮時要按照說明書操作。如果自己染,要戴乳膠手套。不要同時使用不同品牌的染髮劑,染髮劑之間可能會發...