Fortran 中的随机数

Nap*_*pyt 2 random fortran numbers

我正在学习 Fortran,我想做一个小游戏来练习输入。目标是找到好的数字,即随机数字。我编写了一个代码来生成数字,但我的问题是,结果是一个随机数,但它总是相同的。例如,当我执行代码 3 次时,它会打印 3 次 21 。

这是我的代码:

program find_good_number
    integer :: random_number
    integer :: seed
    seed = 123456789
    call srand(seed)
    random_number = int(rand(0)*100)
    print*, random_number
end program find_good_number
Run Code Online (Sandbox Code Playgroud)

你能帮我吗 ?谢谢

jpm*_*ier 5

使用具有标准内在函数的 GNU Fortran 10.3,并要求 Fortran 运行时库查看种子,似乎程序的每次调用都会产生一系列不同的随机数。因此,这对于您想要的应用程序类型来说是可以的。

使用此代码:

Program TestRandom1

  implicit none

  integer :: randomSeedSize
  integer :: count = 3
  integer :: k     = 0
  real    :: rx    = 0.0

  call random_seed(size = randomSeedSize)
  write (*,'(a,i4)')   'size of random seed (in integers): ',  &
                       randomSeedSize

  call random_seed()  ! use system-provided seed

  do k = 1, count
      call random_number(rx)
      write (*, '(a,f10.8)') 'rx = ', rx
  end do

End Program TestRandom1
Run Code Online (Sandbox Code Playgroud)

语境:

$ 
$ uname -s -m -r
Linux 5.13.9-100.fc33.x86_64 x86_64
$ 
$ gfortran --version
GNU Fortran (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ 

Run Code Online (Sandbox Code Playgroud)

测试:

$ 
$ random1.x
size of random seed (in integers):    8
rx = 0.23642105
rx = 0.39820033
rx = 0.62709534
$ 
$ random1.x
size of random seed (in integers):    8
rx = 0.84118658
rx = 0.45977014
rx = 0.09513164
$ 
$ random1.x
size of random seed (in integers):    8
rx = 0.33584720
rx = 0.86550051
rx = 0.26546007
$ 
Run Code Online (Sandbox Code Playgroud)

8*32 = 256 位的种子大小看起来与GNU Fortran 文档中提到的xoshiro256算法一致。

  • 首先,您必须使用 SIZE 参数调用 RANDOM_SEED 来确定种子数组有多大,然后分配一个数组到该大小 - 它并不总是 8,填充它,然后使用 PUT 参数再次调用 RANDOM_SEED。通常使用 SYSTEM_CLOCK 和 DATE_AND_TIME 等例程来获取不同的值。一旦你的编译器支持 RANDOM_INIT,这就会变得容易得多。您可以编写自己的 RANDOM_INIT 版本,将其从主程序中隐藏起来。 (4认同)
  • 这是 [GCC 7](/sf/answers/2234577691/) 中的行为更改。 (2认同)