我需要一个随机数生成器,它在n和m之间产生不同的数字,但是没有相同的概率。我想在n和m之间设置一个值x,其中可能性最高:
使用Random类有一种简单的方法吗?可能性应该具有二项式分布或类似的形式(它的确切二项式分布并不重要,粗略近似也可以)
也许我必须澄清:我不是在寻找二分法或高斯分布,而是在寻找类似这样的东西:
我想定义值x应该是最高可能性的值。
不幸的是先前接受的答案does not seem to work我怀疑的是什么。所以我还在寻找答案!
答案 0 :(得分:6)
您可以使用Box-Muller变换从一系列数字生成一系列伪随机正态分布数,这些数字在0和1之间均匀分布。
答案 1 :(得分:5)
Java SDK具有很好的实现Random.nextGaussian(取自http://download.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian())
我希望很清楚如何从java源解析为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;
}
}
更新:我如何改变中位数:
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;
}
答案 2 :(得分:1)
您需要一台处理“正态分布”的生成器。看看这里: http://www.csharpcity.com/reusable-code/random-number-generators/
答案 3 :(得分:0)
您可以使用您喜欢的任何断点/功能级别。