likm1110 发表于 2015-3-12 23:23:55

如何生成(-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:06

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:19

楚香饭 发表于 2015-3-13 07:43
Program www_fcode_cn
Implicit None
real :: x


阿!好简单,我想多了= =谢谢!

likm1110 发表于 2015-3-13 09:11:22

本帖最后由 likm1110 于 2015-3-13 09:14 编辑

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:46

你的代码是纯数学产生的,需要种子。n 相当于种子。

likm1110 发表于 2015-3-13 15:05:23

楚香饭 发表于 2015-3-13 12:21
你的代码是纯数学产生的,需要种子。n 相当于种子。

这个程序的主程序是要求输入种子的
Write(*,*) 'Enter seed: '
   Read(*,*) iseed
   Call seed(iseed)
这样n的值不是在program里面产生了么?在Module里赋值还有必要吗?

vvt 发表于 2015-3-13 17:50:55

你试试去掉 n 的赋值看看有没有区别啊

likm1110 发表于 2015-3-13 18:11:47

vvt 发表于 2015-3-13 17:50
你试试去掉 n 的赋值看看有没有区别啊

没有区别,我试过了,只是不知道有没有n的初值和程序的安全性有没有关系~
页: [1]
查看完整版本: 如何生成(-1,1)范围内的随机数?