3

数値レシピ スキームを使用して乱数を生成しています (この PDF ファイルのran37 ページ)。おかしなところはなかったのですが、今度は「ウォームアップ」の段階で よりも大きいマイナスの数値が出てしまいました。コードは、これが起こらないように見えます。ifステートメントをwhileステートメントに変更することでこれを簡単に修正できますが、結果はどうなるか知りたいです。MBIGif(mk.lt.MZ)mk=mk+MBIG

編集:ここに関数があります

      FUNCTION ran3a(idum) 
      INTEGER idum
      INTEGER MBIG,MSEED,MZ 
C     REAL MBIG,MSEED,MZ
      REAL ran3a,FAC
      PARAMETER (MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1./MBIG)  
C     PARAMETER (MBIG=4000000.,MSEED=1618033.,MZ=0.,FAC=1./MBIG) 
      INTEGER i,iff,ii,inext,inextp,k
      INTEGER mj,mk,ma(55)  
C     REAL mj,mk,ma(55) 
      SAVE iff,inext,inextp,ma
      DATA iff /0/
      if(idum.lt.0.or.iff.eq.0)then
        iff=1
        mj=MSEED-iabs(idum) 
        mj=mod(mj,MBIG) 
        ma(55)=mj
        mk=1
        do 11 i=1,54
          ii=mod(21*i,55) 
          ma(ii)=mk
          mk=mj-mk
          if(mk.lt.MZ)mk=mk+MBIG
          mj=ma(ii)  
11      continue
        do 13 k=1,4
          do 12 i=1,55
            ma(i)=ma(i)-ma(1+mod(i+30,55)) 
            if(ma(i).lt.MZ)ma(i)=ma(i)+MBIG 
12        continue 
13      continue 
        inext=0
        inextp=31
        idum=1
      endif
      inext=inext+1
      if(inext.eq.56)inext=1
      inextp=inextp+1
      if(inextp.eq.56)inextp=1
      mj=ma(inext)-ma(inextp) 
      if(mj.lt.MZ)mj=mj+MBIG
      ma(inext)=mj
      ran3a=mj*FAC
      return
      END
4

2 に答える 2

-3

pdfを見てみました。あなたがする必要があるのは

1) シード: 値 = ran3(-1)

2) 使用: 値 = ran3(0)

于 2013-05-27T08:08:52.367 に答える