尘路 发表于 2014-3-24 12:09:42

请教,随机数的问题

不用写出程序,只求指出我的程序哪里出错了,谢谢啊
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什么的,数据里全是这个,我吧第二步进行十次,数据一点也没变,求助大家我程序哪里出错了?谢谢大家,感激不尽啊

fcode 发表于 2014-3-24 12:42:31

1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是 S(随机数) ?你的代码貌似直接取了 Z 来判断。

楚香饭 发表于 2014-3-24 13:00:04

本帖最后由 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

尘路 发表于 2014-3-24 20:09:09

fcode 发表于 2014-3-24 12:42
1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是...

是的,就是单纯的随机数,谢谢你啊

尘路 发表于 2014-3-24 20:10:50

chuxf 发表于 2014-3-24 13:00
我写了个版本,看是否是你需要的。

Program www_fcode_cn


还是谢谢你啊!我可以参考看看,您真是好心人嘞!
页: [1]
查看完整版本: 请教,随机数的问题