java 同余法产生随机数_线性同余法生成为随机数
線性同余方法(LCG)是個產生偽隨機數的方法。
它是根據遞歸公式:
其中
是產生器設定的常數。
LCG的周期最大為
,但大部分情況都會少于M。要令LCG達到最大周期,應符合以下條件:
的所有質因子的積能整除
;
若
是4的倍數,
也是;
都比
小;
是正整數。
線性同余算法有m 、a 、c 和X0 4個參數,通過置Xn + 1 ≡aXn + c (mod m) ,求得隨機數序列< Xn > , 這個序列稱作線性同余序列。m、a 、c 和X0 分別稱做模數、乘數、增量和初始值。線性同余方法速度快,如果對乘數和模數進行適當的選擇,可以滿足用于評價一個隨機數產生器的3 種準則:
1.這個函數應該是一個完整周期的產生函數。也就是說,這個函數應該在重復之前產生出0 到m之間的所有數;
2.產生的序列應該看起來是隨機的;
3.這個函數應該用32bit 算術高效實現。
在我的算法中,a=7^5;c=0;m=2^31-1; x0為系統時間;
我的代碼如下:
#include?
#include?
static?unsigned?long?rand_seed;
void?mysrand?(unsigned?long?int);
void?myrand?();
int
main?(void)
{
int?i;
mysrand?(time?(NULL));
for?(i?=?0;?i?
{
myrand?();
}
return?0;
}
void
mysrand?(unsigned?long?seed)
{
rand_seed?=?seed;
}
void
myrand?()
{
rand_seed?=?(rand_seed?*?16807L)?%?((1?<
printf?("%ld?",?rand_seed);
}
===============PS==================
產生隨機種子的方法很多,目前用得比較多的是使用系統時間為種子。我覺得這種方法也不妥當。假如我批量執行程序,程序執行的時間是幾個ms,那么幾個相鄰程序的種子就是一樣的,產生的結果因此也是一樣的。(因為系統時間是按照秒來計算的,一秒內執行多少次,產生的隨機種子就有多少相同的。)
比較流行的是使用seed = (seed * 9301 + 49297) % 233280;
return seed /(233280.0);
總結
以上是生活随笔為你收集整理的java 同余法产生随机数_线性同余法生成为随机数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021美亚杯第七届中国电子数据取证团体
- 下一篇: scipy的安装教程