Fortran Coder

查看: 11599|回复: 7
打印 上一主题 下一主题

[求助] random_numer( )不随机问题

[复制链接]

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
跳转到指定楼层
楼主
发表于 2014-12-5 13:57:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01  program main
02  implicit none
03   interface
04  subroutine random_arr(a)
05  implicit none
06  integer(4),intent(out),allocatable ::a(:)
07  end
08   end interface
09   integer , allocatable :: A(:)
10   integer , allocatable :: B(:)
11   integer len
12call random_arr(A)
13call random_arr(B)
14print *,A
15print *,B
16 
17  end program
18 
19 
20 
21subroutine random_arr(a)
22implicit none
23real(4) temp,temp2
24integer(4) siz,i
25integer(4),intent(out),allocatable ::a(:)
26call random_seed()
27call random_number(temp)
28print *,temp
29siz=int(temp*20)
30print *," ",siz," "
31allocate (a(siz))
32a(:)=0
33loop:do i=1,siz
3430 call random_number(temp2)
35 a(i) = int(temp2*20)
36if(i/=1)then
37if(all( a(1:(i-1))/=a(i)) )then
38cycle loop
39else
40goto 30
41end if
42end if
43End do loop
44end subroutine


temp每次都是0.9几是为什么啊==
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2014-12-5 15:31:18 | 只看该作者
call random_seed()
只需要执行一次就好,也就是说,不能写在子程序中,写在主程序。

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
板凳
 楼主| 发表于 2014-12-5 18:02:49 来自移动端 | 只看该作者
li913 发表于 2014-12-5 15:31
call random_seed()
只需要执行一次就好,也就是说,不能写在子程序中,写在主程序。 ...

嗯,改了,还是不合适诶…-_-#

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
地板
发表于 2014-12-5 20:07:49 | 只看该作者
如果你是想生成互不相同的随机数组,代码米问题。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
5#
发表于 2014-12-5 21:38:16 | 只看该作者
不知道你用的什么编译器?

如果是 gfortran 的话,你需要自己根据系统时间生成种子。Linux 下还可以访问 /dev/urandom 获取种子

[Fortran] 纯文本查看 复制代码
01  program main
02  implicit none
03   interface
04  subroutine random_arr(a)
05  implicit none
06  integer(4),intent(out),allocatable ::a(:)
07  end
08   end interface
09   integer , allocatable :: A(:)
10   integer , allocatable :: B(:)
11   integer len
12call init_random_seed()
13call random_arr(A)
14call random_arr(B)
15print *,A
16print *,B
17 
18  end program
19   
20subroutine random_arr(a)
21implicit none
22real(4) temp,temp2
23integer(4) siz,i
24integer(4),intent(out),allocatable ::a(:)
25 
26call random_number(temp)
27print *,temp
28siz=int(temp*20)
29print *," ",siz," "
30allocate (a(siz))
31a(:)=0
32loop:do i=1,siz
3330 call random_number(temp2)
34 a(i) = int(temp2*20)
35if(i/=1)then
36if(all( a(1:(i-1))/=a(i)) )then
37cycle loop
38else
39goto 30
40end if
41end if
42End do loop
43end subroutine
44 
45subroutine init_random_seed()
46  use iso_fortran_env, only: int64
47  implicit none
48  integer, allocatable :: seed(:)
49  integer :: i, n, un, istat, dt(8), pid , lcg
50  integer(int64) :: t
51 
52  call random_seed(size = n)
53  allocate(seed(n))
54  call system_clock(t)
55  if (t == 0) then
56     call date_and_time(values=dt)
57     t = (dt(1) - 1970) * 365_int64 * 24 * 60 * 60 * 1000 &
58          + dt(2) * 31_int64 * 24 * 60 * 60 * 1000 &
59          + dt(3) * 24_int64 * 60 * 60 * 1000 &
60          + dt(5) * 60 * 60 * 1000 &
61          + dt(6) * 60 * 1000 + dt(7) * 1000 &
62          + dt(8)
63  end if
64  pid = getpid()
65  t = ieor(t, int(pid, kind(t)))
66  do i = 1, n
67     seed(i) = lcg(t)
68  end do
69  call random_seed(put=seed)
70end subroutine init_random_seed
71 
72function lcg(s)
73  use iso_fortran_env, only: int64   
74  integer :: lcg
75  integer(int64) :: s
76  if (s == 0) then
77     s = 104729
78  else
79     s = mod(s, 4294967296_int64)
80  end if
81  s = mod(s * 279470273_int64, 4294967291_int64)
82  lcg = int(mod(s, int(huge(0), int64)), kind(0))
83end function lcg

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
6#
 楼主| 发表于 2014-12-6 00:02:56 | 只看该作者
vvt 发表于 2014-12-5 21:38
不知道你用的什么编译器?

如果是 gfortran 的话,你需要自己根据系统时间生成种子。Linux 下还可以访问 / ...

哇!!用的gfortran,合适了。
感觉后面这段程序好高端!!
感谢大神~

22

帖子

6

主题

0

精华

入门

StarkLee

F 币
96 元
贡献
52 点
7#
 楼主| 发表于 2014-12-6 00:29:17 来自移动端 | 只看该作者
vvt 发表于 2014-12-5 21:38
不知道你用的什么编译器?

如果是 gfortran 的话,你需要自己根据系统时间生成种子。Linux 下还可以访问 / ...

用的gfortran
可以了呢!感谢大神,感觉这段代码好高端!~

100

帖子

0

主题

0

精华

专家

F 币
550 元
贡献
291 点

规矩勋章元老勋章

QQ
8#
发表于 2014-12-6 16:14:41 | 只看该作者
种子是关键,呵呵...
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-1-13 23:57

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表