2014-04-14 16 views
7

Jestem rodzaju nowego w Fortran proramming. Czy ktoś może mi pomóc rozwiązać rozwiązanie. Mam problem generując całkowitą liczbę losową w przedziale [0,5] w Fortran liczbę losową z użyciem random_seed i randjak wygenerować liczbę całkowitą losową w fortranie 90 w zakresie [0,5]?

+1

'rand' to rozszerzenie GNU. Kombinacja Fortran 95 to 'random_seed' i' random_number'. –

+1

Czy wynik jest dokładnie 5 do przyjęcia? A może chciałeś poprosić o zasięg [0,5]? Poniższe sugestie nie podadzą dokładnie wartości punktu końcowego (z wyjątkiem ewentualnego zaokrąglenia). –

+1

@SteveLionel Nie jestem do końca pewien co masz na myśli ... Czy możesz to rozwinąć? –

Odpowiedz

3

Co o:

program rand_test 
    use,intrinsic :: ISO_Fortran_env 
    real(REAL32) :: r(5) 
    integer  :: i(5) 

    ! call init_random_seed() would go here 

    call random_number(r) 

    ! Uniform distribution requires floor: Thanks to @francescalus 
    i = floor(r*6._REAL32) 

    print *, i 
end program 
+2

Użyj 'real :: ...' i '6.', a następnie. Ale proszę, zrób sobie przysługę i przejdź do wyraźnych definicji! –

+0

'i = podłoga (r * 3.) - 1' –

+0

, która jest w porządku, ale czy da jednolity rozkład .....? \ – user3531410

4

Wspieranie answer Alexander Vogt , Uogólnię.

Wewnętrzny random_number(u) zwraca rzeczywistą liczbę u (lub jej tablicę) z rozkładu jednolitego w przedziale [0,1). [Oznacza to, że zawiera 0, ale nie 1.]

Aby mieć dyskretny rozkład jednolity na liczbach całkowitych {n, n + 1, ..., m-1, m} wyrównaj rozkład ciągły w górę do m + 1-W porcje o równych rozmiarach, mapujące każdą porcję na liczbę całkowitą. Jednym ze sposobów może być:

call random_number(u) 
j = n + FLOOR((m+1-n)*u) ! We want to choose one from m-n+1 integers 

Jak widać, do początkowego pytania dla {0, 1, 2, 3, 4, 5} zmniejsza się

call random_number(u) 
j = FLOOR(6*u)   ! n=0 and m=5 

i dla drugiego przypadku w swoim komentarzu {-1, 0, 1}

call random_number(u) 
j = -1 + FLOOR(3*u)  ! n=-1 and m=1 

oczywiście inne transformacje będą wymagane dla zestawów nieciągłych liczb całkowitych, i należy zwrócić uwagę na kwestie liczbowych.

+0

unikniesz pochylenia ze względu na ograniczoną liczbę bitów w "prawdziwej" mantyzie (53 dla podwójnej precyzji IEEE 754, 24 dla pojedynczej -precision), możesz potrzebować kilka razy wywoływać 'random_number', np. patrz [jak' _randbelow (n) 'jest implementowany przez' random() 'w Pythonie] (https://github.com/python/cpython/blob /1dae7450c68bad498e57800387b24cb103c461fa/Lib/random.py#L243-L248) – jfs

Powiązane problemy