主题:这个程序为什么会产生大于1的随机数
tianhy2010
[专家分:60] 发布于 2010-08-25 09:27:00
我算了一个产生随机数的程序,大家帮忙看下吧。按照我的设想,随机数的值应该在-0.5--0.5之间,不知道为什么出现了大于1的随机数
program tian
use IMSL
implicit none
real:: c(4,4)
integer ::i
real w,ra
c=0.0
open(1,file='tian.txt')
call random_seed () ! 系统根据日期和时间随机地提供种子
w=0.5
do i=1,4
call random_number (ra) ! 每次的随机数就都不一样了
w=w-ra
c(i,i)=w !c(i,i)的值随机读取
write(1,*) c(i,i)
enddo
close(1)
end program tian
得到的结果如下:
4.0717363E-02
-8.8709757E-02
-0.7561409
-1.111137
谁能给我解释下啊?
回复列表 (共9个回复)
沙发
tianhy2010 [专家分:60] 发布于 2010-08-25 09:32:00
貌似这样就可以了,但是为什么呢?
w=0.5
do i=1,4
call random_seed () ! 系统根据日期和时间随机地提供种子
call random_number (ra) ! 每次的随机数就都不一样了
w=w-ra
c(i,i)=w !c(i,i)的值随机读取
write(1,*) c(i,i)
enddo
板凳
tianhy2010 [专家分:60] 发布于 2010-08-25 09:41:00
这样还是不行啊,这是大侠jstzhurj给出的办法,刚开始以为可以了,后来发现还是不行,不能每个c(i,i)都给出一个随机值。看上去是可以了,但是还是不行啊。如果不加do循环,发现每次都能得到一个合理的值,也就是介于-0.5----0.5之间的值,但是为什么加上do循环就不行了呢?do循环出问题了吗?下面这个是不加do循环的:
program tian
use IMSL
implicit none
real:: c(4,4)
integer ::i,j
real w,ra
c=0.0
w=0.5
call random_seed () ! 系统根据日期和时间随机地提供种子
call random_number (ra) ! 每次的随机数就都不一样了
w=w-ra
c(1,1)=w
write(*,*) c(1,1)
end program tian
发现每次得到的c(1,1)都是介于-0.5---0.5之间的,但是为什么加上do循环不能保证c(i,i)都是介于-0.5---0.5之间呢?
3 楼
yeg001 [专家分:14390] 发布于 2010-08-25 10:15:00
w=w-ra
c(i,i)=w !c(i,i)的值随机读取
改成
c(i,i)=w-ra
应该就可以了.
你每次循环都在改变w, 它之后就不再是0.5了.
4 楼
tianhy2010 [专家分:60] 发布于 2010-08-25 10:25:00
还是不行。我做了下,每次循环强制让w=0.5,但是c(i,i)的值都变成相同的了,大小在-0.5---0.5之间的一个值,没有完成每个i得到一个随机值的目的。
do i=1,4
w=0.5 !每次循环都让w=0.5
call random_seed () ! 系统根据日期和时间随机地提供种子
call random_number (ra) ! 每次的随机数就都不一样了
c(i,i)=w-ra
enddo
c(i,i)的值在-0.5---0.5之间了,但是都相同。是不是系统根据日期和时间随机地提供种子这种办法不行啊?因为do循环可以说是在同一时间完成的,所以得到的ra也相同了,导致c(i,i)也都相同。怎么才能实现每循环一次,得到一个新的随机数呢?
5 楼
tianhy2010 [专家分:60] 发布于 2010-08-25 10:37:00
这样就可以了,要让系统提供不同的种子才行。
call random_seed () ! 系统根据日期和时间随机地提供种子
do i=1,4
call random_number (ra) ! 每次的随机数就都不一样了
! w=w-ra
c(i,i)=w-ra
enddo
这样我试了下,得到的数据是可以的了,不知道是不是这样啊?
6 楼
jstzhurj [专家分:4680] 发布于 2010-08-25 10:41:00
把call random_seed () 放到循环外面,循环内不能改变w值,忽略了,抱歉!
7 楼
asymptotic [专家分:16630] 发布于 2010-08-25 10:42:00
program main
implicit none
integer, parameter:: ND = 10
real:: RA(ND, ND)
call random_seed()
call random_number( RA )
RA = RA - 0.5
write(unit = *, fmt = *) RA
stop
end program main
8 楼
jstzhurj [专家分:4680] 发布于 2010-08-25 10:46:00
[quote]这样就可以了,要让系统提供不同的种子才行。
call random_seed () ! 系统根据日期和时间随机地提供种子
do i=1,4
call random_number (ra) ! 每次的随机数就都不一样了
! w=w-ra
c(i,i)=w-ra
enddo
这样我试了下,得到的数据是可以的了,不知道是不是这样啊?[/quote]
原因我已经在http://bbs.pfan.cn/post-348377.html 里面说明白了。
9 楼
tianhy2010 [专家分:60] 发布于 2010-08-25 10:54:00
堪称经典帖!!!
我来回复