首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fortran中的随机采样

fortran中的随机采样
EN

Stack Overflow用户
提问于 2012-06-16 00:45:10
回答 1查看 2.2K关注 0票数 0

我有以下数据

代码语言:javascript
复制
X     Y    INFTIME
1     1     0
1     2     4
1     3     4
1     4     3
2     1     3
2     2     1
2     3     3
2     4     4
3     1     2
3     2     2
3     3     0
3     4     2
4     1     4
4     2     3
4     3     3
4     4     0

X和Y表示4乘4的正方形网格中的X和Y分量。在这里,我想从被感染的人群中随机抽样10%,即其INFTIME非零。我没有任何编码的想法,所以无法启动它。任何建议和想法对我来说都是很棒的。谢谢

编辑:

代码语言:javascript
复制
DO T = 1,10
   DO i = 1, 625

      IF(INFTIME(i)/=0 .AND. INFTIME(i) .LE. T)THEN
         CALL RANDOM_NUMBER(u(i))
         u(i) = 1+aint(u(i)*25)
          CALL RANDOM_NUMBER(v(i))
         v(i) = 1+aint(v(i)*25)
          CALL RANDOM_NUMBER(w(i))
         w(i) = 1+aint(w(i)*10)
      ENDIF
   ENDDO
ENDDO


do p = 1,625
  WRITE(*,*) u(p),v(p),w(p)
 enddo

这是我的代码,我试过了,但它只给出了随机数,而不是到数据的连接。我使用了25 x 25网格的数据,即625个人和感染时间为1到10

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-16 01:25:31

照ja72说的做。您有三个大小相同的一维数组(16)。你所需要做的就是在1和16之间选择一个数字,检查INFTIME是否为0,并根据需要接受这个值,然后重复,直到你取了10%的样本(这将是1.6的值,所以我假设你只取2?或者,您是否拥有比您展示的4x4更多的数据?)

编辑您需要在if语句之前调用随机数生成器:

代码语言:javascript
复制
    do t=1,10
      do i=1,625
          ind = 1+int(624*rand(seed))
          if(inftime(ind).neq.0 .and. inftime(ind).le.t) then
             stuff
          endif
       enddo
    enddo

调用ind=1+int(625*rand(seed))将在1(当为rand(seed)=0时)到625 (当为rand(seed)=1时)之间选取一个随机整数。然后,如果满足if语句,则可以执行所需的操作。

编辑: program epimatrix

代码语言:javascript
复制
IMPLICIT NONE
INTEGER ::l, i,T,K
REAL, DIMENSION(1:625):: X,y,inftime
INTEGER::seed,my_cnt
INTEGER,DIMENSION(8) :: time1
CALL DATE_AND_TIME(values=time1)
seed = 1000*time1(7)+time1(8)
call srand(seed)

OPEN(10, FILE = 'epidemicSIR.txt', FORM = 'FORMATTED')
DO l = 1,625
   READ(10,*,END = 200) X(l), Y(l), INFTIME(l)
  ! WRITE(*,*) X(l),Y(l), INFTIME(l)
  ! if you know how it was formatted, you should use
  ! read(10,20) X(l), Y(l), INFTIME(l)
  ! where 20 is the format
ENDDO
200 CONTINUE
CLOSE(10)

DO T = 1,10
   my_cnt=0
   write(*,*) "T=",T
   DO while (my_cnt.le.63)
      K = 1+int(624*rand())
      IF(INFTIME(K)/=0 .AND. INFTIME(K) .LE. T)THEN
         write(*,*) X(k),Y(k),INFTIME(k)
         my_cnt=my_cnt+1
      ENDIF
   enddo
   write(*,*) " "
ENDDO

end program

EDIT 2我已经调整了程序来修复一些问题。我试着保持我的编辑是小写的,这样你就可以看到不同之处。do-while循环允许代码继续运行,直到满足条件my_cnt.le.63 (这意味着每个T有63行X,Y,inftime )。我添加了一行用于输出T,另一行用于添加空格,以便在查看输出时数据可能更清晰。

这应该会解决你遇到的所有问题。如果没有,我会继续查看这个页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11054955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档