请教,随机数的问题
不用写出程序,只求指出我的程序哪里出错了,谢谢啊1.我要建一个模型,100元素的一维数组设为S,每个元素非1即-1.随机数判断产生。计算相邻的乘积值的负值首尾也算相邻-S(1)*S(100)设为M
2.再从1到一百取随机一个数J提出S(J),取S(J)=-S(J),计算M2,再随机取一个数X判断,如果X小于EXP(M2-M),就不改S(J)了,反之,S(J)=-S(J)(意思就是再改回来),然后M=M2(与下一个M2进行比较),再输出M的值保存
3.第二步进行10000步
结果每次都是90.00000000什么的,数据里全是这个,我吧第二步进行十次,数据一点也没变,求助大家我程序哪里出错了?谢谢大家,感激不尽啊
1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是 S(随机数) ?你的代码貌似直接取了 Z 来判断。 本帖最后由 chuxf 于 2014-3-24 13:04 编辑
我写了个版本,看是否是你需要的。
Program www_fcode_cn
Implicit None
Integer , parameter :: DP = Kind(0.0D0)
Integer :: s( 100 )
integer :: i , k , l
Real( Kind = DP ) :: m1 , x , y , z , m2
open (365,file='data.dat')
call random_seed()
do i=1,size(s)
call random_number(x)
if (x.le.0.5) then
s(i)=1
else
s(i)=-1
end if
end do
m1 = CalcM( S )
Do k = 1 , 10000
call random_number(y)
l=1+aint(100*y)
s(l)=-s(l)
m2 = CalcM( S )
call random_number(z)
i=1+aint(100*z)
if (s(i) < exp(m2-m1)) s(l)=-s(l)
m1=m2
write(365,*) m1
end do
contains
Real( Kind = DP ) Function CalcM( s )
Integer :: s(:)
integer :: j , n
n = size( s )
CalcM = -1.0_DP * s(1) * s(n)
Do j = 1 , n - 1
CalcM = CalcM - s(j) * s(j+1)
end do
End Function CalcM
End Program www_fcode_cn fcode 发表于 2014-3-24 12:42
1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是...
是的,就是单纯的随机数,谢谢你啊 chuxf 发表于 2014-3-24 13:00
我写了个版本,看是否是你需要的。
Program www_fcode_cn
还是谢谢你啊!我可以参考看看,您真是好心人嘞!
页:
[1]