! 例題 8-6 抽選 [形状明示仮配列と乱数サブルーチンの利用 ] SUBROUTINE chusen( kk, n1, n2 ) IMPLICIT NONE INTEGER, INTENT ( IN ) :: n1, n2 ! 応募者数と当選者数 INTEGER, INTENT ( OUT ) :: kk( 1 : n1 ) ! 当選者番号 INTEGER :: i, j, temp REAL :: ur kk = (/ ( i, i = 1, n1 ) /) CALL RANDOM_SEED DO i = 1, min( n1, n2 ) - 1 CALL RANDOM_NUMBER( ur ) ! (0, 1) の一様乱数 j = i + INT( ur * ( n1 - i + 1 ) ) ! 残りから任意抽出 temp = kk( i ) kk( i ) = kk( j ) ! i 番目の当選者 kk( j ) = temp ! 入れ替えておく END DO END SUBROUTINE chusen PROGRAM ex8_6 ! 入出力だけ IMPLICIT NONE INTEGER, ALLOCATABLE :: number( : ) INTEGER :: n, m, i PRINT *, '応募者数は?' READ *, n PRINT *, '当選者数は?' READ *, m ALLOCATE ( number( 1 : n ) ) CALL chusen( number, n, m ) PRINT *, ' 順位 番号' DO i = 1, MIN( n, m ) PRINT '( 2X, I4, I8 )', i, number( i ) END DO END PROGRAM ex8_6