Assume we are talking about a standard normal distribution with zero mean and unit variance. For the observer to be able to answer the question "is this sample from a standard normal distribution?" with a high probability of correctness, he needs to know the distribution of distributions from which the sample may have been generated. The probability that the observer will guess "yes" is maximized when the sample is generated from a standard normal distribution, assuming that is possible. So according to my interpretation, you should use the values generated by Box-Muller in step 1 without inspecting them.
I queried fellow students and they brought my attention to this paper: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch37.html
Since the paper is quite long and might not be online forever below is the general idea:
Linear Congruent Generators are ideal for use on the GPU because they are simple and do not require much state (only the previously generated number). but they are not 'random enough' for, for example, Monte Carlo based simulation. A generator like a Mersenne Twister would be better but requires way too much state to be stored.
The solution proposed by the paper is combining several LCGs using a combined Tausworthe Generator (as used by the Mersenne Twister) this guarantees a much better randomness without having to store as much state as the Mersenne Twister. The final algorithm looks like this:
struct RandomResult
{
uint4 state;
float value;
};
uint TausStep(uint z, int S1, int S2, int S3, uint M)
{
uint b = (((z << S1) ^ z) >> S2);
return (((z & M) << S3) ^ b);
}
uint LCGStep(uint z, uint A, uint C)
{
return (A * z + C);
}
RandomResult Random(uint4 state)
{
state.x = TausStep(state.x, 13, 19, 12, 4294967294);
state.y = TausStep(state.y, 2, 25, 4, 4294967288);
state.z = TausStep(state.z, 3, 11, 17, 4294967280);
state.w = LCGStep(state.w, 1664525, 1013904223);
RandomResult result;
result.state = state;
result.value = 2.3283064365387e-10 * (state.x ^ state.y ^ state.z ^ state.w);
return result;
}
Note that the initial seed values for state
should be larger than 128! (For background information reed the paper) and that you should fill the seed with 4 good random numbers from the CPU + four values unique for that pixel to get a nice result.
Best Answer
There's absolutely no reason to use "real" random numbers. Furthermore, those "real" random numbers may be worse that pseudorandom ones. For example, it could happen that for some physical reasons, the "real" random bits are slightly skewed or have slight correlations. That can be corrected using a "randomness extractor" but then, why not just use the same techniques without all the hassle?
There are surely some reasons not to settle for pseudorandomness, but none of them apply in your case. For example, you don't mind that your numbers are deterministic. You don't care if they're cryptographically secure. And you'd want all your experiments to be reproducible (though that's still possible under your "real" model).
As to your concrete final question, yes, it's possible to use outside "real" random bits to influence a cryptographic model generating random numbers. You can probably find some methods in the literature (don't try to invent anything yourself, though). Just keep it mind that instead of focusing on the simulation itself, this will change your focus to something which, in my mind, is completely bogus.