尽管使用了随机种子,随机数仍然保持不变
我有以下一小段代码:
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