33 lines
707 B
Fortran
33 lines
707 B
Fortran
program Knuth_Shuffle
|
|
implicit none
|
|
|
|
integer, parameter :: reps = 1000000
|
|
integer :: i, n
|
|
integer, dimension(10) :: a, bins = 0, initial = (/ (n, n=1,10) /)
|
|
|
|
do i = 1, reps
|
|
a = initial
|
|
call Shuffle(a)
|
|
where (a == initial) bins = bins + 1 ! skew tester
|
|
end do
|
|
write(*, "(10(i8))") bins
|
|
! prints 100382 100007 99783 100231 100507 99921 99941 100270 100290 100442
|
|
|
|
contains
|
|
|
|
subroutine Shuffle(a)
|
|
integer, intent(inout) :: a(:)
|
|
integer :: i, randpos, temp
|
|
real :: r
|
|
|
|
do i = size(a), 2, -1
|
|
call random_number(r)
|
|
randpos = int(r * i) + 1
|
|
temp = a(randpos)
|
|
a(randpos) = a(i)
|
|
a(i) = temp
|
|
end do
|
|
|
|
end subroutine Shuffle
|
|
|
|
end program Knuth_Shuffle
|