尽管使用了随机种子,随机数仍然相同

时间:2014-01-25 15:05:54

标签: random fortran

我有以下一小段代码:

  REAL(8)       :: x
  INTEGER       :: i

  call system_clock(i)
  WRITE(*,*) 'cpu time', i
  CALL random_seed(i)

  CALL random_number(x)
  WRITE(*,*) 'uniform RandVar', x

CPU时间工作正常,但每次运行时我得到相同的制服RandVar number = 0.99755959009261719,几乎像random_number一遍又一遍地使用相同的默认种子并忽略随机种子。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

可能正在使用相同的种子:这取决于处理器。原因是您对random_seed的调用未设置种子。

参考

CALL random_seed(i)

参数i不是(intent(in))种子,而是处理器使用的种子的(intent(out))大小。这个电话就像是

CALL random_seed(SIZE=i)  ! SIZE is the first dummy argument

要设置种子,您需要与PUT伪参数明确关联:call random_seed(put=seed)。这里种子是排名为1的数组,其大小至少为n,其中n - 再次依赖于处理器 - 是call random_seed(size=n)给出的大小。在您的通话中i保留此值。

详情见F2008的13.7.136。

种子生成器的常用方法是:

integer, allocatable :: seed(:)
integer size

call random_seed(size=size)
allocate(seed(size))
! set seed(:) somehow
call random_seed(put=seed)

正确设置seed不是一个简单的过程。我这里没有说明如何做到这一点,但详细信息可以在this other question的答案中找到。

评论中提到的srand()的使用是非标准的。