請問各位高手
unsigned int seed=123;
inline unsigned int rand32(){
seed *= 1664525L;
seed += 1013904223L;
return seed;
}
這是什麼一思呢?
那 L又是指什麼呢?
謝謝!!
2006-08-17 18:29:25 · 2 個解答 · 發問者 no nickname 1 in 電腦與網際網路 ➔ 程式設計
在請問一下Jacob Lee為什麼要用L呢?
rand32( )的rand_max為多少呢?
感謝!!
2006-08-18 03:37:02 · update #1
也就是說 rand32( )慘聲出來亂數的範圍是 0到多少呢?
還有,一定要用L麼?
那本來C++內建的rand( )他是怎ㄇ寫的?
非常謝謝!!
2006-08-18 03:50:44 · update #2
那 rand( ) % 0.2 的話,可以產生 0 ~ 0.2之間的亂數嗎?
不過C++顯示有 error ㄟ。
為什ㄇ呢?
煩請各位高手!!謝謝!!
2006-08-18 13:36:47 · update #3
這是自己寫的一個亂數產生器。L 是指長整數。
2006-08-17 23:30:43 補充:
寫清楚點好了。unsigned int seed=123; // 最開始的亂數值new_seed = a * old_seed + b是標準的亂數寫法。1664525 = 5 * 5 * 139 * 4791013904223 是質數它的 a, b 的大小選得還不錯,且 a 不是偶數,產生效果應該不錯才對。 (通常會建議 a, b 是質數,至少要互質。我對亂數的要求與使用懂一點;對亂數的產生只懂皮毛(只看過一篇小論文)。)
2006-08-18 22:12:06 補充:
dave 所說的 範圍、low bits 不夠亂等的問題都是對的。不過,0. 市面 compiler 用的方法和 dave 寫的一樣 (a, b 各家不同)。簡言之,它多了些看不到的 bits, return 時,只 return 了它的 random number 的部份 high bits。1. Linear CongruEntial ,dave 少打了 一個 e2. 應該是 65536,不是 65546,應該是打錯字了。
2006-08-18 22:12:22 補充:
另外,多數現代的 compiler 提供了不是用Linear congruential generator 做出、且 bits 數較多的亂數的函數。drand48,你可以用用看。當然,drand48系比較複雜,也分 int 和 double 2大組,你要看清楚你要用的是哪一組。
2007-09-12 02:45:29 補充:
我已在我的論壇發表一篇較完整的 rand( )
歡迎有興趣的網友前往觀看,
並提供意見與指正。^_^
http://www.phpbbserver.com/graphicsparalle/viewtopic.php?p=201
2006-08-17 19:02:04 · answer #1 · answered by ? 7 · 0⤊ 0⤋
補充一下:
用L是因為沒用L的話,C是用 int 來存放整數常數,你用的常數是1664525,比一個int可以放的數字還要大,所以用L,告訴 compiler 要用 long (L) 這個型態來存放這個常數…
像你上面產生出來的亂數最大是 unsignd int 可以放的大小 (要看你的 unisnged int是多大,有些 compiler 是 16bit,有些是 32bit)
============================================
ANSI C 的規格只有規定說 rand() 產生的亂數要在 0 跟 RAND_MAX (32767) 之間,並沒有說 rand() 要怎麼寫,但大家的寫法都跟上面的寫法大同小異:
C Compiler 所附的 rand() 都長得跟上面的差不多,例:
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65546) % 32768;
}
這類的PRNG叫作 Linear Congruential RNG,重點都在於找 2 個適合的數字來當
next = next * m + c 裡面的 m 跟 c
但小心喔,Liner Congruntial RNG的最大缺點就是他產生的數字的 lower bits 不是很 random... 例,你上面的例子,要是只取最後的 1 個 bit 的話,他會一次是 0,下一次是 1,你用你的 rand32() 跑下面的程式看看,一看就知道不是亂數…
for( int i =0; i<10;i ++)
{
printf("%d ", rand32() % 2);
}
所以市面上 C Compiler 裡的 rand() 會加上這一段:
return (unsigned int)(next/65546) % 32768;
先除 65546 (要除多少也是看不同家的 compiler 也不一樣啦),就是要去除 lower bits 那些不夠 random 的 bits...
說實在話,這類的 RNG 產生出來的亂數不怎麼亂,所以要是你需要很要的 PRNG,市面上有別種的 Algorithm 可以算出比這些 RNG 要好很多的亂數…
2006-08-18 09:48:08 補充:
16 bits 的 rand_max 就是 2^16-1 = 6553532 bits 的 rand_max 就是 2^32-1 = 4294967295
2006-08-18 20:38:19 補充:
%只能用在整數上,要 0-0.2的亂數:double ans = ((double)rand() / RAND_MAX) * 0.2;
2006-08-18 05:36:31 · answer #2 · answered by Dave 7 · 0⤊ 0⤋