6 votos

Cómo/por qué hace esta función de ruido de trabajo?

Cómo/por qué hace esta función de ruido de trabajo?

function noise(x)
    x = (x << 13) ^ x;
    return (1.0 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff)
               / 1073741824.0);

Me he encontrado en varios lugares con diferentes números primos, pero no podía encontrar una explicación real de por qué/cómo funciona.

Yo sé lo que el propio código que está haciendo (shift, xor, multiplicar y desbordamiento, bit a bit y w/ intmax - 1, etc), pero no entiendo por qué esas cosas se hacen o cómo se traduce en ruido aceptable.

¿Por qué son estas operaciones, el porqué de esta orden? Por qué los números primos? Sé ", porque no los números primos pueden generar patrones observables", pero ¿por qué?

Por qué dividir por (2**32 - 1)/2? o más bien, ¿por qué los que le dan un 0..2 valor?

2voto

johnny Puntos 9

La función de los spreads de la información contenida en el valor de la entrada a través de la completa de 32 bits, a continuación, escalas hasta el rango de $-1..1$.

Esta primera parte se hace la entrada afectan tanto a la parte inferior y superior de bits:

x = (x << 13) ^ x;

Luego de que la información se transmite a través de la disposición de dominio (32 bits) mediante la multiplicación y la adición a las tres constantes de magnitudes diferentes - uno pequeño, uno mediano y uno grande:

digest = x * (x * x * 15731 + 789221) + 1376312589

Por último, el "azar" entero es reducido. 0x7fffffff es $2^{31}$, por lo que el bit a bit Y la operación se asegura de que el número está en el rango de $0..2^{31}$. 1073741824 es $2^{30}$, e $2^{31} \div 2^{30} = 2$, así que después de la división de la gama se $0..2$. Restando $1$ cambia el rango de $-1..1$.

return 1.0 - ((digest & 0x7fffffff) / 1073741824.0);

No estoy seguro de por qué las constantes deben ser primos. Tal vez los números primos tienen mejores patrones de bits para este tipo de cosas.

Vale la pena señalar que el resultado de esta función será diferente en diferentes lenguajes de programación. Es muy probable que haya un desbordamiento de entero, que es dependiente del lenguaje incluso para unsigned enteros de 32 bits. En Python3 el número puede ser promovido a tener más de 32 bits, por lo que le dará algún resultado, aunque no habrá desbordamiento (pero desbordamiento puede ser conveniente aumentar la aleatoriedad). En JavaScript de la función de falla por completo para números grandes, debido a que el bit a bit Y siempre resulta en 0 para los números muy grandes (en mis pruebas).

1voto

MaxW Puntos 435

Es un generador de ruido aleatorio. Hice la búsqueda en Google en: "el ruido de la función" 0x7fffffff

Ver: http://www.qwerty-games.com/viewvc/Sardon3D/Branches/Networking/src/Noise.cpp?view=markup

http://libnoise.sourceforge.net/noisegen/index.html

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