10 votos

¿Qué es el cociente de oro haciendo en este código de computadora?

En este archivo (relacionados con la generación de números aleatorios), es la siguiente línea:

  private const int MSEED = 161803398;

que se asemeja a la proporción áurea.

¿Cómo cociente de oro juega un papel importante en la generación de números aleatorios? Me puede ayudar a entender esto desde el punto de vista matemático?

NOTA: Naturalmente, me atrevo a predecir que habrá muchas personas diciendo: Esta es la programación de que se trate. Sin embargo, estoy pidiendo respuesta/aclaración/visión de la matemática punto de vista. Espero que puedan hacer de esta sutil distinción.


Actualización

Después de algunas investigaciones, encontré que el origen más probable del código he ligado en la parte superior es el siguiente comentario y código: (del libro NUMÉRICA RECETAS, pg. 198):

Por último, le damos Knuth sugerencia para un portátil de rutina, que hemos traducido para el presente convenciones como RAN3. Esto no es basado en el lineal congruential método en absoluto, sino más bien en una método sustractivo. Uno podría esperar que sus debilidades, si, son de por lo tanto, de muy diferente carácter de las deficiencias, si las hubiere, de RAN1 por encima de [no]. Si alguna vez sospecha de problemas con uno la rutina, es una buena idea probar las otras en la misma aplicación. RAN3 tiene una característica interesante: si su máquina es pobre en entero aritmética (es decir, se limita a números enteros de 16 bits), la sustitución de la dos ", comentó" líneas para el siguiente les va a representar la rutina totalmente de punto flotante.

      FUNCTION RAN3(IDUM)
Returns a uniform random deviate between 0.0 and 1.0. Set IDUM to any negative value
to initialize or reinitialize the sequence.
C         IMPLICIT REAL*4(M)
C         PARAMETER (MBIG=4000000.,MSEED=1618033.,MZ=0.,FAC=2.5E-7)
      PARAMETER (MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1.E-9)
According to Knuth, any large MBIG, and any smaller (but still large) MSEED can be
substituted for the above values.
      DIMENSION MA(55)                  Save MA. This value is special and should not be modified; see Knuth
      DATA IFF /0/
      IF(IDUM.LT.0.OR.IFF.EQ.0)THEN     Initialization
        IFF=1
        MJ=MSEED-IABS(IDUM)             Initialize MA(55) using the seed IDUM and the large number MSEED.
        MJ=MOD(MJ,MBIG)
        MA(55)=MJ
        MK=1
        DO 11 I=1,54                    Now initialize the rest of the table
          II=MOD(21*I,55)               in a slightly random order
          MA(II)=MK                     with numbers that are not especially random
          MK=MJ-MK
          IF(MK.LT.MZ)MK=MK+MBIG
          MJ=MA(II)
11      CONTINUE
        DO 13 K=1,4                     We randomize them by "warming up the generator"
          DO 12 I=1,55
            MA(I)=MA(I)-MA(1+MOD(I+30,55))
            IF(MA(I).LT.MZ)MA(I)=MA(I)+MBIG
12        CONTINUE
13      CONTINUE
        INEXT=0                         Prepare indices for our first generated number
        INEXTP=31                       The constant 31 is special; see Knuth
        IDUM=1
      ENDIF
      INEXT=INEXT+1                     Here is where we start, except on initialization. Increment INEXT,
      IF(INEXT.EQ.56)INEXT=1             wrapping around 56 to 1.
      INEXTP=INEXTP+1                   Ditto for INEXTP
      IF(INEXTP.EQ.56)INEXTP=1
      MJ=MA(INEXT)-MA(INEXTP)           Now generate a new random number subtractively
      IF(MJ.LT.MZ)MJ=MJ+MBIG            Be sure that it is in range
      MA(INEXT)=MJ                      and output the derived uniform deviate
      RAN3=MJ*FAC
      RETURN
      END

9voto

gammatester Puntos 7985

Si usted mira el código que encontrarás que la rutina es de recetas Numérica. Y si usted mira ahí encontrarás el comentario:According to Knuth, any large MBIG, and any smaller (but still large) MSEED can be substituted for the above values.

De hecho, el NR de rutina se deriva de Knuth de la sustracción de generador de IN55 (descrito en Seminumerical Algoritmos 3.6), lo que también explica la magia de 55 años en el NR y MS código.

9voto

Hurkyl Puntos 57397

Es bastante común, cuando uno necesita un solo "al azar" gran constante que no necesita tener ninguna propiedades especiales (aparte, posiblemente, de ser demasiado simple), el uso de los dígitos de números populares. $\pi$ es el más común, creo, pero la proporción áurea tasas como una serie popular, así que estaría unsurprised para ver que se utiliza demasiado.

1voto

Sean O'Connor Puntos 1

Si quería hacer un generador de números aleatorios utilizando sólo la adición, a continuación, la proporción áurea es su mejor opción. Echa un vistazo a "Aditivo Recurrencia":

Baja discrepancia secuencia

Porque es un número impar tiene todo el período (2^32 para int, 2^64 de largo) con complemento a 2 de la aritmética . Para una correcta generador de números aleatorios puede utilizar un (invertable, para mantener el período completo) hash con eso.
SplitMix64

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X