Idea
Para un Trazado de aplicación que se necesita para generar una buena calidad de números pseudo-aleatorios en el intervalo cerrado [0~1]. Porque estoy haciendo esto en el GPU (HLSL Shader Model 5) sólo puedo usar 32 bits variables. Mi planteamiento inicial es la siguiente:
Siempre Marco el pixel shader recibir una buena pseudo random number ([0~1]) de la CPU, el uso de C++s'
std::mt19937
generador ystd::uniform_real_distribution
.Porque para cada píxel de este número es el mismo yo también uso las coordenadas de la pantalla
u
yv
de cada píxel estos también se encuentran en [0~1].Llamo al Multiplicar Con el método del Llevar, como el de abajo.
Algoritmo
// seed is the value given from the cpu
float3 random = Random(seed + u, seed + v)l
// Multiply With Carry, returns 3 floating point values {x, y, z}
// x: the random number
// y, z: new seeds for the next time we need a random number
float3 Random(float seed_a, float seed_b)
{
uint m_z = asuint(seed_a);
uint m_w = asuint(seed_b);
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
float r = ((m_z << 16) + m_w) / (float)0xFFFFFFFF;
return float3(r, asfloat(m_z), asfloat(m_w));
}
Esto produce la siguiente salida. (La parte de la izquierda es el número aleatorio obtenido a partir del método Aleatorio para este píxel, la parte derecha es la visualización de u
y v
como el Rojo y el Verde.
Resultado
Como usted puede ver, hay claramente un patrón, por lo que la aleatoriedad no es bueno en absoluto. Lo que perjudica el rendimiento de mi algoritmo enormemente. Esto es probablemente debido al hecho de que el original se Multiplica a Llevar método supone m_z
y m_w
son enteros de 64 bits, no de 32 bits.
Lo que quiero
Lo que estoy buscando es una solución a la implementación de mi Multiplicar con Llevar método de forma que se produce razonablemente bien los números pseudo-aleatorios y trabaja en el cerrado [0~1] el intervalo en lugar de el abierto [0~1] intervalo. Sin embargo, puesto que es muy posible que este método sólo puede trabajar a la derecha con 64 bits enteros estoy también estaría muy contento si alguien puede sugerir otro pseudo random number generator algoritmo que:
- Funciona con 32 bits de los números
- Produce uniformemente distribuida resultados en el cerrado [0~1] intervalo de
- No requiere demasiada información de estado, (por eso elegí el MwC ya que sólo necesita para almacenar 2 variables), ya que es difícil en la GPU. 16 de 32 bits variables sería el máximo creo que desde que la tienda que en la matriz de 4x4 que es fácil pasar de todo.