> integer(i13), parameter:: i_max = 63
> integer(i13), parameter:: i_tot = i_max*2 +1
> integer(i13), parameter:: sides = i_tot
> integer(i13), parameter:: trials = 10
>
> integer(i13), dimension(trials)::C
> integer(i13), dimension(trials)::F
>
> integer(i13):: b, i, &
> Â Â Â Â Â Â diff2, c3, c4
> real:: harvest, diff, t3, t4
>
> ! seed random num generator
[snip]
>
> do i = 1, trials
>
> Â Â call random_number(harvest)
> Â Â b = min(max(1,ceiling(harvest*sides)),sides)
>
> C(i) = b
>
> end do
> print *, 'C ='
> print *, C
>
> print *, 'F ='
>
> do i = 1, trials
>
> F(i) = C(i) - i_max
> end do
> print *, F
[snip]
> does this prog give
> equiprobable integers on the interval of [-i_max , i_max] ?
No. It looks like you have an off by one bug. Consider this test
program:
C:\Users\epc\temp>type rf.f90
implicit none
integer,parameter :: i_max = 63
integer,parameter :: i_tot = 2 * i_max + 1
integer,parameter :: trials = 10 * i_tot
integer k(-i_max:i_max)
integer b, i
real harvest
k = 0
do i=1,trials
call random_number(harvest)
b = -i_max + int( harvest * i_tot )
k(b) = k(b) + 1
end do
print *,k
end
C:\Users\epc\temp>g95 rf.f90
C:\Users\epc\temp>a
11 9 9 8 12 8 10 10 11 10 13 13 10 6 4 9 13 12 6 10 6 12 9 11 10 8 16
8 6 13 10
7 5 7 10 9 6 11 15 9 16 12 7 10 11 9 9 11 6 18 8 8 11 12 11 12 9 15 9
14 10 6 1
0 10 7 12 12 15 11 10 9 10 8 11 14 8 11 12 11 11 9 9 7 10 6 8 10 16 14
7 9 2 12
8 11 11 11 14 5 12 8 4 12 10 11 10 12 11 10 7 9 11 14 8 11 9 7 12 13
12 7 8 10 1
0 15 11 9
int( harvest * i_tot ) gives an integer from 0 to i_tot-1
OR from 0 to 2*i_max
subtracting i_max gives an integer from -i_max to i_max
This is one traditional way of picking a random integer over a range.
1 + int ( 6 * harvest), for example, is the classical way of rolling a
die.
- e