3

看起来很简单,但我想要一个公式(最好是.net):

对于给定的数字,比如 1.5,公式将输出一个随机数,该随机数取一个系列的平均值约为 1.5...所以它可能是 0.1、1.2、7.1、2.5、.2 等,但平均值将接近1.5。

澄清:我希望数字是正数。

4

3 回答 3

2
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)); 
    }
于 2013-07-09T21:27:35.550 回答
1

有很多可能的方法来做到这一点。其中之一总是积极的,是生成指数分布的值。生成具有指定均值的指数随机变量的算法是:

public static double ExpRV(double mean, Random rnd) {
   return -mean * Math.Log(rnd.NextDouble());
}

[编者注:转换为 C#。]

当你计算出一堆这些时,平均值应该相当接近mean

如果您需要单个值的有界范围,则需要不同的分布,但是由于您没有将其指定为约束,因此应该为您执行此操作。

于 2013-07-10T00:11:58.513 回答
0

我认为你有来自 targetAvg 的三个参数,numPoints、targetAvg 和 maxDist。

在 (2, 2*maxDist) 范围内随机选取 numPoints 个点。

计算平均值。

通过将 targetAvg-avg 添加到每个点来移动。

这将为您提供围绕目标平均值的点,该平均值与您的目标完全一致(尽可能接近浮点数学允许)。

于 2013-07-11T03:15:02.740 回答