fork(1) download
  1. !データの集合からランダムに重複なく選ぶ(2次元)
  2. !http://d...content-available-to-author-only...o.jp/qa/question_detail/q14136390554
  3. !選んだかどうかを記録する配列を用意し、
  4. !組み合わせを1つ得たらそれがすでに選ばれたものかどうかを判定し、
  5. !選ばれていればループを回して選び直す
  6. !サンプルプログラムとしては100*100=10000では多いので3*2=6にした。
  7. !選ぶ個数(繰り返し回数)は5とした。
  8. !Fortran90以降での乱数の使用は以下のサイトを参考にした
  9. !http://w...content-available-to-author-only...n.jp/main/programming/fortran.html
  10. program randuniq
  11. implicit none
  12. !乱数用
  13. real :: rnd
  14. integer :: seedsize
  15. integer,allocatable :: seed(:)
  16. !データ数定義
  17. integer,parameter :: xsize=3, ysize=2 !範囲内のデータの個数
  18. integer :: n=5 !選ぶ個数(繰り返し回数)
  19. !選んだかどうか記録する配列(0で初期化)
  20. integer :: selected(xsize,ysize)=0
  21. !その他の変数
  22. integer :: xselection,yselection
  23. integer :: i
  24.  
  25.  
  26. !乱数初期化
  27. call random_seed(size=seedsize)
  28. allocate(seed(seedsize))
  29. call random_seed(get=seed)
  30.  
  31. !選ぶ個数(繰り返し回数)のチェック(データ数を超えると無限ループになる)
  32. if (n>xsize*ysize) n=xsize*ysize
  33.  
  34. !重複なく選んで出力
  35. write(*,*)"x selection","y selection"
  36. do i=1,n
  37. do
  38. call random_number(rnd)
  39. xselection=int(rnd*xsize)
  40. call random_number(rnd)
  41. yselection=int(rnd*ysize)
  42. if (selected(xselection+1,yselection+1)==0) exit
  43. end do
  44. selected(xselection+1,yselection+1)=1
  45. write (*,*)xselection,yselection
  46. end do
  47. stop
  48. end program
  49.  
Success #stdin #stdout 0s 4028KB
stdin
Standard input is empty
stdout
 x selectiony selection
           2           1
           1           0
           0           0
           2           0
           1           1