NCF参数化建筑论坛

标题: 关于随机算法的问题 [打印本页]

作者: panhao1    时间: 2010-11-22 16:15
标题: 关于随机算法的问题
public class rnd{ int S; int A=13; int M; int C=3; public rnd(int n){M=N*4;S=1;} public float next(){ S=(S*A+C)%M; //println(M); return (float)S/M; } } } 这是所谓的乘同余法 但是效果很不好 很快就开始循环了 求高手指点 这是失败的效果 [attach]12587[/attach] 如果把A换成电脑时间的末尾(秒) [attach]12588[/attach] 求解释
作者: 990628    时间: 2010-11-22 21:26
潘皓都不懂,群里还有谁能懂呢?
作者: claudemit    时间: 2010-11-23 02:10
Orz一直在用原始试错法写程序路过。。。
作者: 天明2009    时间: 2010-11-23 13:59
我看不懂!介绍一下吧!
作者: holonking    时间: 2010-11-23 15:28
这种不叫“循环”,这是他的pattern, 伪随机数的图案都是十分有规律的,都是在平行的线上(像你这个)或着点都在平行的面上,所以都叫 deterministic random number. 你这种是Linear Congruential Generator,最大的周期是M(会有少于M的周期),M越大周期越长。 LCG对 a,c,M的选择十分敏感,选得不好可以很废物,一般M是二的次方,常用的是2的32次方或64次方 。 详情可搜索Linear Congruential Generator,可找到各常用编译器设定的LCG参数
作者: 小新同学    时间: 2010-11-23 18:16
这个真的得慢慢学学
作者: ayutandy096    时间: 2010-11-23 18:44
慢慢来。。。
作者: panhao1    时间: 2010-11-23 22:59
5# holonking 太感谢了 我还以为书上的公式是瞎忽悠呢
作者: claudemit    时间: 2010-11-24 00:10
http://en.wikipedia.org/wiki/Linear_congruential_generator 我按照这里提供的参数构造了一下 [attach]12639[/attach] 是不是我理解有误,结果这么有规律啊。。。 void setup() { size(300,200); background(255); strokeWeight(1); } void draw(){ rnd rx=new rnd(); rnd ry=new rnd(); for(int i=1;i 作者: wang1203060219    时间: 2010-11-24 04:32
学学!学习了!
作者: panhao1    时间: 2010-11-26 00:00
9# claudemit 这是正常现象 你注意换A和C的值就行 一般是通过电脑上的时间算得
作者: suzhou    时间: 2010-12-15 10:12
很简单的算法!却有如此效果!
作者: x5115x    时间: 2011-7-3 08:48
呵呵,这个有点意思,5楼讲解很清楚。
作者: 史角民    时间: 2011-9-8 02:58
必高升国际有限公司,只做原装正品




欢迎光临 NCF参数化建筑论坛 (http://bbs.ncf-china.com/) Powered by Discuz! X3.2