Fortran Coder

标题: 如何生成(-1,1)范围内的随机数? [打印本页]

作者: likm1110    时间: 2015-3-12 23:23
标题: 如何生成(-1,1)范围内的随机数?
本帖最后由 likm1110 于 2015-3-12 23:26 编辑

如何生成(-1,1)范围内的随机数?
1.
ran = Mod(9876*n+156956,1324556)可以生成一个[0,1324555)的数
n = ran/1324556则生成[0,1)的数
利用这个可以做出一个生成[0,1)数的子程序,当ran里的参数未知,可视为生成随机数。
如何利用它生成[-1,1)的随机数?


作者: 楚香饭    时间: 2015-3-13 07:43
[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  real :: x
  integer :: i
  call RANDOM_SEED()
  Do i = 1 , 10 !// 10个
    call RANDOM_NUMBER( x )
    x = x * 2.0 - 1.0
    write(*,*) x
  End Do
End Program www_fcode_cn

作者: likm1110    时间: 2015-3-13 08:08
楚香饭 发表于 2015-3-13 07:43
[mw_shl_code=fortran,true]Program www_fcode_cn
  Implicit None
  real :: x

阿!好简单,我想多了= =谢谢!
作者: likm1110    时间: 2015-3-13 09:11
本帖最后由 likm1110 于 2015-3-13 09:14 编辑

[Fortran] 纯文本查看 复制代码
Module ran001
   Implicit None
   Save
   Integer :: n = 9876
End Module ran001
!-------------------------------------------------------------
Subroutine random0(ran)
   Use ran001
   Implicit None
   Real, Intent(out) :: ran
   n = Mod(8121 * n + 28411, 134456)    ! A number between 0 and 134455
   ran = real(n) / 134456.      ! Generate a number [0,1.)
End Subroutine random0
!-------------------------------------------------------------
Subroutine seed(iseed)
   Use ran001
   Implicit None
   Integer, Intent(in) :: iseed
   n = abs(iseed)
End Subroutine seed

这是一个产生为随机数的程序。我就想问问,在Module里为什么要定义n的初值?
作者: 楚香饭    时间: 2015-3-13 12:21
你的代码是纯数学产生的,需要种子。n 相当于种子。
作者: likm1110    时间: 2015-3-13 15:05
楚香饭 发表于 2015-3-13 12:21
你的代码是纯数学产生的,需要种子。n 相当于种子。

这个程序的主程序是要求输入种子的
[Fortran] 纯文本查看 复制代码
Write(*,*) 'Enter seed: '
   Read(*,*) iseed
   Call seed(iseed)

这样n的值不是在program里面产生了么?在Module里赋值还有必要吗?
作者: vvt    时间: 2015-3-13 17:50
你试试去掉 n 的赋值看看有没有区别啊
作者: likm1110    时间: 2015-3-13 18:11
vvt 发表于 2015-3-13 17:50
你试试去掉 n 的赋值看看有没有区别啊

没有区别,我试过了,只是不知道有没有n的初值和程序的安全性有没有关系~




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2