2016-05-24 18 views
1

Ich verwende den folgenden Code mir Samen zu initialisieren (ich weiß nicht, wo ich es gefunden, aber jeder scheint absolut jeder genau diese zu haben! Warum? Warum 37?)Warum gibt der Fortran RANDOM_SEED ein Array ein?

SUBROUTINE init_random_seed() 
IMPLICIT NONE 
INTEGER :: i, n, clock 
INTEGER, DIMENSION(:), ALLOCATABLE :: seed 

CALL RANDOM_SEED(size = n) 
ALLOCATE(seed(n)) 

CALL SYSTEM_CLOCK(COUNT=clock) 

seed = clock + 37 * (/ (i - 1, i = 1, n) /) 
CALL RANDOM_SEED(PUT = seed) 

DEALLOCATE(seed) 
END SUBROUTINE 

Nun, warum ist die Argument von PUT ein Array (der Größe .ge. n)? Ich kann nur Quellen finden, die sagen, dass das so sein sollte, nicht warum.

  1. S.12 von http://www.mhhe.com/engcs/general/chapman/intro/INTRINSI.PDF
  2. https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fSEED.html
  3. https://software.intel.com/en-us/node/581112
+0

Es ist ein Array, weil der Fortran-Standard sagt, es ist ein Array (das könnte der Größe 1 sein). Fragen Sie darüber hinaus, warum ein PRNG davon profitieren könnte, einen Staat zu haben, der durch mehr als eine Nummer beschrieben wird? – francescalus

+0

Ja. Insbesondere beschreibt der PRNG [hier] (https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fNUMBER.html). – physkets

Antwort

1

Ich bezweifle sehr, "absolut jeder" hat Ihren Ausdruck mit 37.

Warum 37? Man kann die Hypothese aufstellen, dass einige Pseudozufallsgeneratoren Sequenzen von verdächtiger Qualität aus trivialen Anfangssamen (wie [0,0,0 ...] + aktuelle_Zeit) geben und daher einige ausreichend groß auswählen (aber nicht zu groß, um einen Überlauf zu vermeiden)) Primzahl und verwenden Sie ein Vielfaches davon, um mehr nicht-trivialen Samen zu erhalten. Man kann immer noch argumentieren, ob es in diesem Seed genug Entropie geben wird, und ich würde diesen Ausdruck für eine fortgeschrittene Verwendung (Kryptographie oder sogar einige Monte-Carlo-Simulationen) vermeiden.

Um sicher zu sein, müssen Sie diejenigen Leute fragen, die mit diesem bestimmten Ausdruck kamen.

Würden andere Werte wie 31 oder 41 ähnlich funktionieren? Das glaube ich sehr. Sie können sie ausprobieren und sehen, aber Sie können unterschiedliche Ergebnisse von verschiedenen Compilern erwarten, die verschiedene Generatoren verwenden. Sie können auch eine andere Kombination von noch größeren Primzahlen verwenden und nicht nur Vielfache von einem, es gibt viele Möglichkeiten ...

Wenn Sie jedes Mal einen anderen Startwert erhalten möchten, können Sie auch die Methode verwenden in der GCC 4.8 Handbuch: https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

Es ist sehr beliebt und bemerken, dass es keine 37 in ihrem Ausdruck gibt, verwenden sie eine erweiterte Methode, um einen Samen mit genug Entropie zu bekommen.

Und schließlich, Warum ist das Seed ein Array? Weil der Standard das sagt.

Und warum ist der Standard so konzipiert? (wahrscheinlich) Weil es in einem Array mehr Entropie gibt als in einer einzigen Zahl. Sie haben einfach mehr Kombinationen möglich.

+0

Als Beispiel ist die Größe von Intel Fortran RANDOM_SEED 2. Ich kenne einige Implementierungen, die größere Seed-Arrays haben. –