2014-04-14 10 views
7

Ich bin etwas neu in der Fortran-Programmierung. Kann mir bitte jemand mit der Lösung helfen. Ich habe ein Problem der ganzzahligen Zufallszahl im Bereich Erzeugung von [0,5] in Fortran Zufallszahl random_seed und randWie generiere ich eine ganze Zahl in Fortran 90 im Bereich [0,5]?

+1

'rand' ist eine GNU-Erweiterung. Die Fortran 95 Kombination ist 'random_seed' und' random_number'. –

+1

Ist ein Ergebnis von genau 5 akzeptabel für Sie? Oder wollten Sie nach der Bandbreite [0,5] fragen? Die folgenden Vorschläge geben Ihnen nicht genau den Endpunktwert (außer möglicherweise durch Runden.) –

+1

@SteveLionel Ich bin nicht ganz sicher, was Sie meinen ... Könnten Sie das weiter ausführen? –

Antwort

3

Was:

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

Verwenden Sie 'real :: ...' und '6.' dann. Aber bitte, tu dir selbst einen Gefallen und wechsle zu expliziten Definitionen! –

+0

'i = Boden (r * 3.) - 1' –

+0

das ist in Ordnung, aber wird es gleichmäßige Verteilung geben .....? \ – user3531410

4

Um die answer von Alexander Vogt zu unterstützen Ich verallgemeinere.

Die intrinsische random_number(u) gibt eine reelle Zahl u (oder ein Array von solchen) aus der Gleichverteilung über das Intervall [0,1). [Das heißt, es enthält 0, aber nicht 1.]

Um eine diskrete gleichförmige Verteilung auf den ganzen Zahlen {n, n + 1, ..., m-1, m} zu haben, schneide die kontinuierliche Verteilung bis in m + 1-n-Chunks gleicher Größe, wobei jeder Chunk auf eine ganze Zahl abgebildet wird. Eine Möglichkeit könnte sein:

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

Wie Sie sehen können, für die Ausgangsfrage für {0, 1, 2, 3, 4, 5} dies reduziert auf

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

und für den anderen Fall in Ihrem Kommentar {-1, 0, 1}

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

natürlich werden andere Transformationen für Sätze von nicht zusammenhängenden ganzen zahlen erforderlich sein, und man sollte die Aufmerksamkeit auf numerische Probleme zu zahlen.

+0

zu vermeiden, Skew wegen der begrenzten Anzahl von Bits in 'echten' Mantisse (53 für IEEE 754 Double-Precision, 24 für Single -precision), müssen Sie vielleicht 'random_number' mehrmals aufrufen, zB [wie' _randbelow (n) 'über' random() 'in Python implementiert wird] (https://github.com/python/cpython/blob) /1dae7450c68bad498e57800387b24cb103c461fa/Lib/random.py#L243-L248) – jfs

Verwandte Themen