24小时热门版块排行榜    

CyRhmU.jpeg
查看: 3018  |  回复: 14

贺仪

铁杆木虫 (著名写手)

[求助] fortran 随机数 每次运行都是一样的!

如题 fortran 随机数 每次运行都是一样的!
call random_seed ()
call random_number (rd);
由于计算的时间很短,运行起来每次还是一样的!
大家怎么忙解决?
回复此楼
嘟啦啦嘟啦啦嘟
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

asaka

银虫 (初入文坛)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来 2011-09-05 06:51:26
贺仪(金币+5): 多谢你的热心帮助 2011-09-05 19:42:30
你把
call random_seed ()
放在do循环外头!
6楼2011-09-05 02:44:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

贺仪(金币+5): 多谢你的热心帮助 2011-09-05 19:42:11
每次都一样是什么意思?同一个程序,每次运行结果当然应该是一样的啊……
2楼2011-09-04 14:56:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

贺仪

铁杆木虫 (著名写手)

引用回帖:
2楼: Originally posted by snoopyzhao at 2011-09-04 14:56:30:
每次都一样是什么意思?同一个程序,每次运行结果当然应该是一样的啊……

但我是个随机过程 就不应该一样的 。我用matlab得到的是不同的,但是用fortran得到的就是相同的。在取种子的时候seed取时间能不能精确到毫秒呢?要能到就可以了
嘟啦啦嘟啦啦嘟
3楼2011-09-04 15:07:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


xzhdty(金币+1): 欢迎常来程序语言看看 2011-09-05 06:52:00
引用回帖:
3楼: Originally posted by 贺仪 at 2011-09-04 15:07:58:
但我是个随机过程 就不应该一样的 。我用matlab得到的是不同的,但是用fortran得到的就是相同的。在取种子的时候seed取时间能不能精确到毫秒呢?要能到就可以了

你的意思是,你在程序中取了很多随机数,然后,随机数是一样的吗?

另外,种子与时间有啥关系?你以时间作种吗?

给段代码看看吧……
4楼2011-09-04 15:29:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

贺仪

铁杆木虫 (著名写手)

引用回帖:
4楼: Originally posted by snoopyzhao at 2011-09-04 15:29:13:
你的意思是,你在程序中取了很多随机数,然后,随机数是一样的吗?

另外,种子与时间有啥关系?你以时间作种吗?

给段代码看看吧……

你的意思是,你在程序中取了很多随机数,然后,随机数是一样的吗? 不是一样的的,是我想运行两次希望得到不同的结果 两次分别运行的到结果是一样的

另外,种子与时间有啥关系?你以时间作种吗?
本来想以时间做种,这样的话 运行两次得到的结果就是不一样的 但是时间太短了,得到的还是一样的,

给段代码看看吧……
      do jj=1,5000
         do i=1,100000
            call random_seed ()
           call random_number (rd)
                if (rd<=p(1)) THEN
                           …………………………
                     else if (rd<=p(2) .AND. rd>p(1)) THEN
                           …………………………
                     else if (rd<=p(3) .AND. rd>p(2)) THEN
                           …………………………
                     else if (rd<=p(4) .AND. rd>p(3)) THEN
                           …………………………                  
                     else if (rd<=p(5) .AND. rd>p(4)) THEN
                           …………………………
                     else
                           …………………………
            end if         
             end do
             std=tdx*tdx+tdy*tdy;
         write(10,130) tt,std;
         end do
嘟啦啦嘟啦啦嘟
5楼2011-09-04 15:58:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

贺仪

铁杆木虫 (著名写手)

引用回帖:
6楼: Originally posted by asaka at 2011-09-05 02:44:38:
你把
call random_seed ()
放在do循环外头!

也试过了,最前面也放过作用不大,后来只有让程序等一段时间再运行 有点时间差也就好了。不过好像与变量声明也有关系
real::rd

real rd
有什么区别呢?
后者是不可以,利用时间产生随机数的 加了call random_seed ()也没用。兄台知道的话,麻烦帮忙讲解一下,谢谢咯!
嘟啦啦嘟啦啦嘟
7楼2011-09-05 09:24:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

贺仪(金币+10): 多谢你的热心帮助 2011-09-05 19:42:40
引用回帖:
7楼: Originally posted by 贺仪 at 2011-09-05 09:24:07:
也试过了,最前面也放过作用不大,后来只有让程序等一段时间再运行 有点时间差也就好了。不过好像与变量声明也有关系
real::rd

real rd
有什么区别呢?
后者是不可以,利用时间产生随机数的 加了call  ...

real :: rd 和 real rd 在语法上是没有什么区别的,但属于两个不同的标准,后者是 Fortran 77 的变量声明方式,前者是 90 及以后的声明方式。建议不要混用,在某些情况下可能会出现一些问题……
8楼2011-09-05 11:01:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★
微尘、梦想(金币+2): 2011-09-07 12:04:14
参考一下下面的程序,后面那个子程序抄自 gfortran 的帮助文件。
CODE:
program test
   real :: r
   
!  call random_seed()
   call init_random_seed()
   
   do i=1,10
      call random_number(r)
      write(*,*) r
   end do
   
end program test

subroutine init_random_seed()
   integer :: i, n, clock
   integer, dimension(:), allocatable :: seed
   
   call random_seed(size = n)
   allocate(seed(n))
   
   call system_clock(count=clock)
   
   seed = clock + 37 * (/ (i - 1, i = 1, n) /)
   call random_seed(put = seed)
   
   deallocate(seed)
end subroutine init_random_seed

9楼2011-09-05 21:42:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小子wx

铜虫 (小有名气)

楼主可以将时间作为随机数产生的种子,要不就是把上次产生的随机数当作下次产生的种子
用matlab时直接就是把系统时间作为产生随机数的种子的所以每次生成的数都不会一样
10楼2011-11-23 20:41:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 贺仪 的主题更新
信息提示
请填处理意见