- 在线时间
- 18 小时
- 最后登录
- 2013-3-2
- 注册时间
- 2012-1-8
- 听众数
- 6
- 收听数
- 11
- 能力
- 0 分
- 体力
- 240 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 92
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 46
- 主题
- 1
- 精华
- 0
- 分享
- 0
- 好友
- 7
升级 91.58% TA的每日心情 | 无聊 2013-3-2 14:34 |
---|
签到天数: 26 天 [LV.4]偶尔看看III
|
相信很多人用概率算法或用蒙特卡罗模拟时,都要用到产生随机数。但是在用C语言的随机函数时不免遇到很多问题,我看了很多代码,有些人的代码随机数产生竟然只用rand()。细心的人会发现,你一个程序连续rand多少次,输出的都是同一个数,这是由机子决定的。有的人会用srand和time函数,把系统当前时间当随机数的种子,但是这种情况也不行,因为一个程序的运行时间很多都在一秒以内。( k' \6 B4 I8 V+ o
查了很多资料,很多人想到了用线性同余法生成伪随机数,相信不少人试过。但是只要有人细心的把你输出的伪随机数输出来看,你就会发现不到一百个它们就会重复。笔者用了很多方法都没法避免,这样无论你模拟多少次,得到的结果都和模拟几十次是一样的,误差太大。用线性同余法,我写过的最好的蒙特卡罗的程序求pi也不过是稳定在3.22左右。
: S& A" O! I# D1 D, R1 \6 U/ D0 K4 m/ w喜欢用C,C++有编程的有相同遭遇的哥们顶一下。通过查阅一些资料,我已经自创一种随机数池法,能产生真正的随机数,对pi最好的模拟结果是3.1415。要是这帖子有很多人支持的话我会和大家共享资源的。 |
zan
|