c 產生隨機數的程式,C 產生隨機數的程式

2022-02-27 12:12:04 字數 1046 閱讀 5379

1樓:柯墨

要看r的**了吧。。。如果r的**是某個和時間有關的數 就可以解釋了

後三句就是 讓某個在65536和0之間的數除以65536獲得0和1之間的隨機數

2樓:匿名使用者

r = 2053.0 * r + 13849.0; //這是兩個有個是素數吧 應該是的 2053就是

//質因數分解13849=11*1259

//那麼這兩個素數的公倍數大於65535吧

//而65535是unsigned short兩個位元組吧

//這樣遞迴 乘開後就能分散到(低2位元組)所有0-65536的數字

這個隨機產生辦法的靈魂就在這句了:r = 2053.0 * r + 13849.0

其實就是《線性同餘法》 產生的隨機數

線性同餘法:一般遞推公式為:xn = (a*x(n-1) + c)%m rn = xn/m

其中m為模數,a為常子(乘數),c為增量(加數),且均為非負整數.

給定一組引數,就可以得到一列數,它是否具有類似於均勻隨機變數的獨立抽樣序列的性質,與這些引數的選擇有關.例如,用下面的遞推公式產生的隨機數就是比較好的隨機數:

a=235 c=0 m=0xfff-21 種子x0小於m就行

s = (int)(r / 65536.0); //取整 得到高字(高2位元組)部分的整數

r = r - s * 65536.0; //去掉高字(高2位元組)部分的整數 不細講 分解就知道 明顯

其實你會發現 上面3句後 s和r仍然為整數 下面假定r, s是unsigned int了

改寫上面兩句,就容易理解了:(去掉乘除法, 速度還能快一點)

r = r & 0xffff; //(一個語句解決,看明白了吧) r的值在0-65536之間

rnd = r / 65536.0; //65536.0使除法不進行整數除法 rnd是0和1之間 由上面一看就知道了

程式好一點的寫法:

float myrand(unsigned int seed=1)

就這樣吧

c 問題rand預設產生的隨機數範圍

隨機數bai產生的範圍是 0 0x7fff 也就du是0到32767 include include include include using namespace std void main srand unsigned time null 時間參zhi數作為種子 for int i 0 i 32...

c如何產生01之間開區間的隨機數

用rand函式產生一列1 32768的數,除以32769.0來實現。舉例 回如下 答 include stdafx.h if the vc 6.0,with this line.include stdio.h include stdlib.h include time.h int main void...

rand產生的是偽隨機數,什麼叫偽隨機數 還有rand和sr

rand 最大 最小 這樣輸入範bai圍產生隨機數,但du是電腦zhi裡的隨機數順dao序已經排列好了,執行程式後你內會發現每次出現容的隨機數都一樣,所以要設定一個隨機數種子,來插入電腦已經排列好的隨機順序,這樣就能解決每次出現一樣資料的問題。把下面這段程式加到rand 前面就ok了。unsigne...