Visual_Basic 板


LINE

大家應該都知道 用 X=Rnd 指令就可以得到一個介於0~1之間的均勻分布亂數 也就是 X~Uniform(0,1) 然而 VB 只能產生均勻分布的亂數 因此小弟最近寫了個各種分布的亂數產生程式來用 但發現生出來的東西似乎不是很精確 因此進一步對 Rnd 這個指令加以檢驗 才發現大事不妙 理論上 由於X~Uniform(0,1) 故E(X)=1/2, Var(X)=1/12 因此 當我們反覆取n個亂數後 再計算其平均和變方 隨著 n->∞ 所得的平均和變方應該會趨近1/2和1/12 這也是所謂蒙地卡羅法(Monte Carlo)和拔靴法(Bootstrap)等的理論基礎 在各種科學領域的應用多不勝數 最簡單的蒙地卡羅法應用 大概就屬在單位平面中逢機取點來估算圓周率了 這個我在高中時就玩過了 應該不需要在這邊班門弄斧才對 離題了 話說現在要驗證Rnd是否真的符合均勻分布 於是我寫了這樣的小程式加以驗證: Open "rnd.txt" For Output As #1 X1 = 0: X2 = 0: Randomize For I = 1 To 10000000 X = Rnd X1 = X1 + X X2 = X2 + X ^ 2 If I Mod 100000 = 0 Then EX = X1 / I VarX = (X2 - EX ^ 2 * I) / I 'Print #1, I, X Print #1, I, EX, VarX * 12 End If Next I Close #1 全部的變數都宣告為倍精度 這個程式基本上就是反覆取1000萬個亂數 並同時累積計算 韈X 和 韈X^2 然後每隔10萬個就輸出一次平均EX和變方VarX*12 結果如下: 100000 0.500341235609055 0.998641767848771 200000 0.499809045362473 1.00078372215905 300000 0.500107454074224 0.998437901086435 400000 0.500276461744309 0.998385742258827 500000 0.500290068372726 0.999079838731831 600000 0.500419607292811 1.00021925961703 700000 0.50026993564742 1.00019207389547 800000 0.50015473200798 1.000139160073 900000 0.500144928914176 1.00052572698579 1000000 0.500105085889816 1.00056944920825 略 9000000 0.500131491163254 0.999874573474332 9100000 0.500137886596617 0.999861888329618 9200000 0.500145418414655 0.999857654740129 9300000 0.500141381108992 0.999838666710201 9400000 0.50014871621416 0.999868309864149 9500000 0.50014508351587 0.99988266186096 9600000 0.500142511142095 0.999940878307397 9700000 0.50014840750419 0.999973340103397 9800000 0.500148654139577 0.999944556581512 9900000 0.500138692927601 0.999910212634631 10000000 0.500136948072433 0.999931865426466 按理 所得的平均和12倍變方應該會趨近於0.5和1 然而 一開始做10萬次模擬發現沒有收斂(在0.49-0.51間亂跳) 做到1000萬次也只收斂到小數第四位 而且是有偏歪的 0.50013-0.50014 也難怪轉換出來的各種分布亂數是有問題的了 這麼一來 用VB來做模擬研究 不就有問題了嗎? 那是 Rnd 指令本身有問題 還是我的程式哪邊搞錯了呢? 可以請大家幫忙看看嗎? 請問各位先進 有人知道 VB 的 Rnd 亂數產生指令是怎麼運作的嗎? 它是經由怎樣的公式運算產生的呢? 不知哪邊可以查得到? 懇請賜教,感激不盡 -- 迷時師渡 悟時自渡 ~ 六祖惠能 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.140.18.156 meto000:轉錄至看板 Statistics 06/25 00:08
1F:→ MOONRAKER:簡單虛擬亂數產生器大多是 XOR + Shift 06/25 03:21
2F:→ MOONRAKER:或者最多是 R(n) = ( R(n-1) * K ) mod M 這種形式 06/25 04:45
3F:→ MOONRAKER:你得出rnd()的bias可能是因為浮點進位的誤差所致 06/25 04:46
4F:→ MOONRAKER:但我認為你可以自己寫一個輸出整數的亂數產生器 06/25 04:46
5F:→ MOONRAKER:簡單的可以找超有名的numerical recipes系列來看 06/25 04:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP