English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

我欲創造一 下降斜波 5V~0V
每個下降點差0.05V so共有100階
但因我每個週期 值不想一樣
想要讓每個下降值能在+-0.05內變動(但維持下降規則)
類似附加上雜訊的意思

簡化程式碼如下

ex_1 :
for(j=1 ; index<100 ; index++,j++)
 buf[index]=(5-(5/(100.)*j)+(0.05/(rand()%1000))-(0.05/(rand()%1000));
result_1 :
 2.8998172786
 inf      <===what's wrong
 2.7955169674
 2.7500442124
----------------------------------------------------------------------------
ex_2 :
for(j=1 ; index<100 ; index++,j++)
 buf[index]=(5-(5/(100.)*j)+(0.05/rand())-(0.05/rand());
result_2 :
 2.7500000001
 2.7000000000
 2.6500000000
 2.6000000001
 2.5500000000
--------------------------------------------------------------
Q1 : 請問為什麼 我加入%1000 (欲將rand值限於0~999)
會不規則出現 inf or -inf
Q2 : 規則上 rand() 是介於0~32767
那麼出來的值 為何比rand()%1000 (介於0~1000)
還不平均呢??
也就是
0.05 / (max 32767 min 0)
0.05 / (max 999 min 0)
應該是上者解析度較高阿 ?!
但我printf出來的值 卻相反

謝謝

2006-11-15 06:39:59 · 1 個解答 · 發問者 Anonymous in 電腦與網際網路 程式設計

Q1我知道了
我忘記rand()%1000
會產生 0~999之間的亂數
如果是0 就會掛掉了
必須+1

請問Q2呢

2006-11-15 06:47:38 · update #1

1 個解答

亂數學問很深喔!有 3、5百頁的專書在討論!亂數通常只是 RNDnew = (RNDold * A + B) mod C其中 C 通常只是用有限的 byte 數自然剩下餘數。如,在 8 bits 中:  78 * 23 + 9 = 1803,在 8 bits 中自然 mod 256 剩 11 A, B, C 互質您的問題就在原始亂數值〝可能〞只是 0 ~ 32767(看 compiler)。試想,若在 0~32767的 原始亂數值中,要 取 0 ~ 30000 的亂數,會準嗎?還是 取 0 ~    30 的亂數準?假設您的compiler的亂數平均性極好,那32767 / 30 = 1092 + 7/30其中,只有 7 個東東加在前 7 的 slot 裡!就是說,這 30 個 slot 裡,前 7個各分配到的 1093 /32767,後23個各分配到的 1092 /32767。差 1/1093 = 0.00091491...,有多大差別?同理,32767 / 30000 = 1 + 2767/30000前 2767 有 2,後 30000 只有 11/2 = 0.5!!!!您要的東東若超過某一定值,就要找更大的亂數來用!您要均勻性,除了要找更大亂數來用外,要用亂數的 high bits,不要用 low bits!rand48() 比 rand() 大多了。它是一系列的東東,您上網查一下。

2006-11-15 14:18:12 補充:
忘了告訴您怎麼用 high bits,如困您要 0 ~ 1000,如下:( (float) rand() / RAND_MAX ) * 1000RAND_MAX 是 rand() 的最大值,lrand48() 的最大值是啥,忘了。您自己查一下。

2006-11-16 00:51:41 補充:
天下沒有白吃的午餐。在程式設計的領域,更是如此。要均勻性,要就犧牲速度!要速度,就要犧牲均勻性!不管是用rand48或high bits 來解決都一樣!兩個一起用,均勻性更好,但速度……當然,亂數還有其它的東東,如:隨機性。不在您問的範圍內,略。

2006-11-16 01:00:49 補充:
另有一個解決之道,就是自已寫更大的亂數:1. 用 R = rand() * rand(); 好處:簡單、快速、相容性高(舊 compiler 不支援 rand48)。 缺點:均勻性不好!!!!(仍沒解決您要的問題!)

2006-11-16 01:01:15 補充:
2. 用我上面列出的公式自己從頭寫一個! 你要用長度在 long 以上的整數變數, 並且 mod 用的 C就是你要的值。 好處:只要 A, B取得好,保證夠均勻。    通常會比內建 rand 或 rand48快!(原因下述。)

2006-11-16 01:02:43 補充:
 缺點:A, B 要取得好 (記得還要和 C 互質),要有點經驗。    好的 rand() 還另設了一個 hidden value,通常是一個 byte。    這個做法複雜一點(是內建 rand 慢的原因。)    一般的程式師不用(也不必)去做這點。    不過,一但 A, B, C 不小心被人知道了,亂數就〝不亂〞了!    它是為了讓使用者看到這次亂數值,就算知道了 A, B, C,也猜不到下一個亂數!    因為,只 Show 出了RNDold 的一部份。

2007-09-12 02:43:57 補充:
我已在我的論壇發表一篇較完整的 rand( )
歡迎有興趣的網友前往觀看,
並提供意見與指正。^_^

http://www.phpbbserver.com/graphicsparalle/viewtopic.php?p=201

2006-11-15 09:10:13 · answer #1 · answered by ? 7 · 0 0

fedest.com, questions and answers