void LatinHypercube(Float *samples, int nSamples, int nDim, RNG &rng) { // Generate LHS samples along diagonal Float invNSamples = (Float)1 / nSamples; for (int i = 0; i < nSamples; ++i) for (int j = 0; j < nDim; ++j) { Float sj = (i + (rng.UniformFloat())) * invNSamples; samples[nDim * i + j] = std::min(sj, OneMinusEpsilon); } // Permute LHS samples in each dimension for (int i = 0; i < nDim; ++i) { for (int j = 0; j < nSamples; ++j) { int other = j + rng.UniformUInt32(nSamples - j); std::swap(samples[nDim * j + i], samples[nDim * other + i]); } } }