gpt4 book ai didi

random - 数字食谱 ran3 生成负数

转载 作者:行者123 更新时间:2023-12-05 08:00:53 25 4
gpt4 key购买 nike

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

编辑:这里是函数

      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

最佳答案

我遇到了段错误(使用 gfortran 4.8),因为该函数试图将输入值 idum 从负数更改为 1。该行没有任何原因(也没有任何 iff), 所以我把它删掉并在几个不同的地方打印出数组 ma ,发现数组中没有负数。

不过,一种可能性是,如果 iabs(idum) 大于 MSEED,则 mj=MSEED - iabs( IDUM)。您应该像书中写的那样使用 mj=abs(MSEED-abs(idum)) 来防止这种情况。

关于random - 数字食谱 ran3 生成负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16757154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com