2014-04-14 56 views
7

我是fortran proramming中的新人。 任何人都可以請幫我解決方案。 我有使用 RANDOM_SEED和蘭特在FORTRAN隨機數範圍[0,5]產生整數隨機數 的問題如何在fortran 90中生成[0,5]範圍內的整數隨機數?

+1

'rand'是一個GNU擴展。 Fortran 95組合是'random_seed'和'random_number'。 –

+1

5是您接受的結果嗎?還是你的意思是要求範圍[0,5)?下面的建議不會給你完全的終點值(除非可能四捨五入。) –

+1

@SteveLionel我不太清楚你的意思...你可以擴展它嗎? –

回答

3

什麼:

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

然後使用'real :: ...'和'6.'。但是,請你幫個忙,然後切換到明確的定義! –

+0

'i = floor(r * 3。) - 1' –

+0

沒關係,但它會給出均勻的分佈.....?\ – user3531410

4

爲了通過亞歷山大沃格特支持answer ,我會概括。

固有的random_number(u)從區間[0,1)中的均勻分佈返回實數u(或這樣的數組)。 [也就是說,它包括0但不是1]。

爲了在整數{n,n + 1,...,m-1,m}上有一個離散的均勻分佈,將連續分佈劃分爲m + 1-n個相等大小的塊,將每個塊映射到一個整數。的一種方法是:

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

正如你可以看到,對於{0,1,2,3,4,5}這降低到

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

和用於其它情況下,最初的問題您的評論{-1,0,1}

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

當然,其他轉換將需要設置不連續的整數,和一個要注意的問題數值。

+0

,以避免由於'真正'尾數有限的位數歪曲(53爲IEEE 754雙精度,24爲單-precision),你可能需要多次調用'random_number',例如,看看['_randbelow(n)'是如何通過Python中的random()實現的](https://github.com/python/cpython/blob /1dae7450c68bad498e57800387b24cb103c461fa/Lib/random.py#L243-L248) – jfs

相關問題