看起来很简单,但我想要一个公式(最好是.net):
对于给定的数字,比如 1.5,公式将输出一个随机数,该随机数取一个系列的平均值约为 1.5...所以它可能是 0.1、1.2、7.1、2.5、.2 等,但平均值将接近1.5。
澄清:我希望数字是正数。
public class RandomAroundAverage
{
Random r = new Random();
public double Random(double middle, double scale)
{
return r.NextDouble() * scale - (scale / 2) + middle;
}
}
然后
var v = r.Random(1.5, 20);
它会生成随机数 -8.5 -> 11.5
并看到它在行动......
var r = new RandomAroundAverage();
var sum = 0.0;
for (int i = 0; i < 10000; i++)
{
var v = r.Random(1.5, 20);
sum += v;
Console.WriteLine(string.Format("Value: {0} Average: {1}", v, sum/i));
}
有很多可能的方法来做到这一点。其中之一总是积极的,是生成指数分布的值。生成具有指定均值的指数随机变量的算法是:
public static double ExpRV(double mean, Random rnd) {
return -mean * Math.Log(rnd.NextDouble());
}
[编者注:转换为 C#。]
当你计算出一堆这些时,平均值应该相当接近mean
。
如果您需要单个值的有界范围,则需要不同的分布,但是由于您没有将其指定为约束,因此应该为您执行此操作。
我认为你有来自 targetAvg 的三个参数,numPoints、targetAvg 和 maxDist。
在 (2, 2*maxDist) 范围内随机选取 numPoints 个点。
计算平均值。
通过将 targetAvg-avg 添加到每个点来移动。
这将为您提供围绕目标平均值的点,该平均值与您的目标完全一致(尽可能接近浮点数学允许)。