尽管使用了随机种子,随机数仍然保持不变
我有以下一小段代码:
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 RandVar number = 0.99755959009261719使用相同的默认种子并忽略随机种子。
我究竟做错了什么?
同样的种子可能正在被使用:这是依赖于处理器的。 原因是你对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)给出的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不是一个简单的过程。 我在这里没有解决如何做到这一点,但可以在其他问题的答案中找到详细信息。
使用评论中提到的srand()是非标准的。
上一篇: Random numbers keep coming out the same, despite random seed being used
