The Java SDK has a good implementation of Random.nextGaussian (taken from http://download.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian ())
Hope it's pretty clear how to deal with java source in C #
synchronized public double nextGaussian() { if (haveNextNextGaussian) { haveNextNextGaussian = false; return nextNextGaussian; } else { double v1, v2, s; do { v1 = 2 * nextDouble() - 1; // between -1.0 and 1.0 v2 = 2 * nextDouble() - 1; // between -1.0 and 1.0 s = v1 * v1 + v2 * v2; } while (s >= 1 || s == 0); double multiplier = Math.sqrt(-2 * Math.log(s)/s); nextNextGaussian = v2 * multiplier; haveNextNextGaussian = true; return v1 * multiplier; } }
UPDATE: How I did a median shift:
public static float gaussianInRange(float from, float mean, float to) { if( !(from < mean && mean < to) ) throw new IllegalArgumentException(MessageFormat.format("RandomRange.gaussianInRange({0}, {1}, {2})", from, mean, to)); int p = _staticRndGen.nextInt(100); float retval; if (p < (mean*Math.abs(from - to))) { double interval1 = (_staticRndGen.nextGaussian() * (mean - from)); retval = from + (float) (interval1); } else { double interval2 = (_staticRndGen.nextGaussian() * (to - mean)); retval = mean + (float) (interval2); } while (retval < from || retval > to) { if (retval < from) retval = (from - retval) + from; if (retval > to) retval = to - (retval - to); } return retval; }
Dewfy
source share