首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字配方ran3生成负数

数字配方ran3生成负数
EN

Stack Overflow用户
提问于 2013-05-26 15:41:54
回答 2查看 1.1K关注 0票数 3

我正在使用数字配方方案来生成随机数(ran3,第7页in this PDF file)。我没有注意到任何奇怪的东西,但这一次,我在“热身”阶段得到了一个负数,它比MBIG大。代码看起来似乎不应该发生这种情况。我可以通过将if语句更改为if(mk.lt.MZ)mk=mk+MBIG行的while语句来轻松解决这个问题,但我想知道结果是什么。

编辑:下面是函数

代码语言:javascript
复制
      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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-28 19:53:48

我得到了Seg错误(使用gfortran4.8),因为函数试图将输入值idum从负数更改为1。没有原因(iff也没有任何原因),所以我删除了它,并在几个不同的位置打印出数组ma,但在数组中没有发现负数。

但是,一种可能是,如果iabs(idum)MSEED大,那么mj=MSEED - iabs(idum)行可能会有问题。您应该像本书中所写的那样,通过使用mj=abs(MSEED-abs(idum))来防止这种情况。

票数 3
EN

Stack Overflow用户

发布于 2013-05-27 16:08:52

请看一看pdf。你需要做的是

1)设置种子: value = ran3(-1)

2)使用: value = ran3(0)

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16757154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档