【问题标题】:Random Number in FortranFortran 中的随机数
【发布时间】:2021-10-22 19:24:47
【问题描述】:

我正在学习 Fortran,我想制作一个小游戏来练习输入。目标是找到一个随机的好数字。我编写了一个代码来生成数字,但我的问题是,结果是一个随机数,但它总是一样的。 例如,当我执行代码 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

你能帮帮我吗? 谢谢

【问题讨论】:

  • 注意子程序 random_number 是标准的 Fortran 随机数生成器,stand 是一个扩展,可能并非所有编译器都支持

标签: random fortran numbers


【解决方案1】:

将 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

上下文:

$ 
$ 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.

$ 

测试:

$ 
$ 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
$ 

8*32 = 256 位的种子大小看起来与 here in the GNU Fortran documentation 提到的 xoshiro256 算法一致。

【讨论】:

  • 这是GCC 7 的行为变化。
  • 请注意,Fortran 标准没有定义不带参数调用 RANDOM_SEED 的行为。有些编译器随机化种子,有些则没有。 F2018 有 RANDOM_INIT 用于此目的。
  • @SteveLionel - 你是对的,我担心这意味着,如果我们需要确保在每个平台上随机种子会尽职尽责地从运行到运行,我们必须使用一些资源Fortran 外部。例如,调用一个 C 例程并让它采样 /dev/urandom。或者让一些 Python 脚本用 8 个随机整数填充一个小文本文件。这是一个不幸的情况:-(
  • 首先,您必须使用 SIZE 参数调用 RANDOM_SEED 以确定种子数组有多大,然后分配一个数组到该大小 - 它并不总是 8,填充它然后再次调用 RANDOM_SEED使用 PUT 参数。通常使用诸如 SYSTEM_CLOCK 和 DATE_AND_TIME 之类的例程来获取不同的值。一旦您的编译器支持 RANDOM_INIT,这将变得容易得多。您可以编写自己的 RANDOM_INIT 版本,从主程序中隐藏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多