Fortran Coder

标题: 请教,随机数的问题 [打印本页]

作者: 尘路    时间: 2014-3-24 12:09
标题: 请教,随机数的问题
不用写出程序,只求指出我的程序哪里出错了,谢谢啊
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什么的,数据里全是这个,我吧第二步进行十次,数据一点也没变,求助大家我程序哪里出错了?谢谢大家,感激不尽啊

Text1.f90

671 Bytes, 下载次数: 9


作者: fcode    时间: 2014-3-24 12:42
1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是 S(随机数) ?你的代码貌似直接取了 Z 来判断。
作者: 楚香饭    时间: 2014-3-24 13:00
本帖最后由 chuxf 于 2014-3-24 13:04 编辑

我写了个版本,看是否是你需要的。

[Fortran] 纯文本查看 复制代码
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
fcode 发表于 2014-3-24 12:42
1.随机数需要种子。建议你加上
2.再随机取一个数X判断,如果X小于EXP(M2-M)这句话里的 X 是随机数,还是  ...

是的,就是单纯的随机数,谢谢你啊
作者: 尘路    时间: 2014-3-24 20:10
chuxf 发表于 2014-3-24 13:00
我写了个版本,看是否是你需要的。

[mw_shl_code=fortran,true]Program www_fcode_cn

还是谢谢你啊!我可以参考看看,您真是好心人嘞!




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2