回 帖 发 新 帖 刷新版面

主题:Linux 下fortran产生随机数的问题 (gfortran)

Code:
program my_random
    implicit none
    real::x
    integer::i
    call random_seed()
    do i=1,10
    call random_number(x)
    write(*,*) x
    end do
end


编译后运行的结果是
Code:
0.99755955   
  0.56682467   
  0.96591532   
  0.74792767   
  0.36739087   
  0.48063689   
  7.37542510E-02
  5.35517931E-03
  0.34708124   
  0.34224379   


再编译运行:
Code:
0.99755955   
  0.56682467   
  0.96591532   
  0.74792767   
  0.36739087   
  0.48063689   
  7.37542510E-02
  5.35517931E-03
  0.34708124   
  0.34224379   


额,问题出现了,无论重新编译运行多少次,每次都是那10个随机数,不懂是什么问题阿,Google过了,都说加上 call random_seed()就好,可是我加了阿,还是不行,windows的fortran编译器就不会出现这样的问题。大家有知道解决方法的么,多谢咯

回复列表 (共5个回复)

沙发


program my_random
    implicit none
    real::x
    integer::i
    call init_random_seed()
    do i=1,10
    call random_number(x)
    write(*,*) x
    end do
end

SUBROUTINE init_random_seed()
INTEGER :: i, n, clock
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
CALL RANDOM_SEED(size = n)
ALLOCATE(seed(n))
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 * (/ (i - 1, i = 1, n) /)
CALL RANDOM_SEED(PUT = seed)
DEALLOCATE(seed)
END SUBROUTINE

板凳

加上 call random_seed()就可以了

3 楼

最好调用系统时钟作为随机种子输入,gfortran不能自己给定种子。二楼正解。

4 楼

我也碰到这个问题了,不知道gfortran编译器是不是有什么特别的地方没注意到。
先用cvf用着吧,毕竟问题比较少一些。

5 楼

[quote]我也碰到这个问题了,不知道gfortran编译器是不是有什么特别的地方没注意到。
先用cvf用着吧,毕竟问题比较少一些。[/quote]
还有这种说法……

gfortran的seed按照默认处理是以程序开始来弄的,每次计时不一样才怪。

cvf和ivf都不知道默认是以什么来抛种子呢,也可能是系统运行时间,不知道才是最可怕的情形。

为啥你们都不知道seed里面是有参数的呢

我来回复

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