回 帖 发 新 帖 刷新版面

主题:这个程序为什么会产生大于1的随机数

我算了一个产生随机数的程序,大家帮忙看下吧。按照我的设想,随机数的值应该在-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个回复)

沙发

貌似这样就可以了,但是为什么呢?

    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

板凳

这样还是不行啊,这是大侠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 楼

w=w-ra            
c(i,i)=w              !c(i,i)的值随机读取
改成
c(i,i)=w-ra
应该就可以了.
你每次循环都在改变w, 它之后就不再是0.5了.

4 楼

还是不行。我做了下,每次循环强制让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 楼

这样就可以了,要让系统提供不同的种子才行。
  call random_seed ()     ! 系统根据日期和时间随机地提供种子
  do i=1,4 
   call random_number (ra)  ! 每次的随机数就都不一样了
!   w=w-ra            
      c(i,i)=w-ra
  enddo

这样我试了下,得到的数据是可以的了,不知道是不是这样啊?

6 楼


把call random_seed () 放到循环外面,循环内不能改变w值,忽略了,抱歉!

7 楼

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 楼

[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 楼

堪称经典帖!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册