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...