Random 尽管使用了随机种子,随机数的结果还是一样的

Random 尽管使用了随机种子,随机数的结果还是一样的,random,fortran,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.9975595909261719,几乎就

我有以下一小段代码:

  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.9975595909261719
,几乎就像
random\u number
反复使用相同的默认种子并忽略随机种子一样


我做错了什么?

很可能使用了相同的种子:这取决于处理器。原因是对
random\u seed
的调用没有设置种子

参考

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

CALL random_seed(SIZE=i)  ! SIZE is the first dummy argument
要设置种子,您需要显式地与
PUT
伪参数关联:
callrandom\u seed(PUT=seed)
。这里,种子是大小至少为
n
的秩1数组,其中
n
-同样取决于处理器-是
调用随机种子(大小=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)
适当地设置
种子
并不是一个简单的过程。我在这里不讨论如何做到这一点,但详细信息可以在以下问题的答案中找到


注释中提到的
srand()
的使用是非标准的。

好吧,我找到了一种产生随机数的方法:调用系统时钟(I)调用srand(I)写(,)Rand()-但仍然好奇为什么上面的代码不起作用?部分“不知怎么地设置种子(:)穷人:
call system_clock(count)$call random_seed(size)$allocate(seed(size),source=count+37*[(i,i=0,size-1)])$call random_seed(put=seed)$deallocate(seed)