【问题标题】:Random number that averages a particular number平均特定数字的随机数
【发布时间】:2013-07-07 15:40:41
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不为您的随机数指定一个范围。你甚至可以将结果除以 100 得到浮点数。
  • 那里有很多动人的作品。您是否需要保证在 N 个项目之后它会在 1.5 左右,或者只是“可能”?您允许的范围有多大?
  • 如果 1.5 是您的平均值,您会认为 -1000 和 1003 是有效值吗?你的极值是多少?
  • 任何以 1.5 为中间值的范围都倾向于平均 1.5
  • 所以你想要不平衡的随机数?即,范围 0.0 -> 20.0 但平均为 1.5?

标签: c# algorithm random


【解决方案1】:

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

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

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

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

如果您需要单个值的有界范围,则需要不同的分布,但由于您没有将其指定为约束,这应该为您做。

【讨论】:

    【解决方案2】:

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

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

    计算平均值。

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

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

    【讨论】:

      【解决方案3】:
      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)); 
          }
      

      【讨论】:

      • +1 以获得简单、清晰的解决方案。您可以通过返回 (r.NextDouble() - 0.5) * scale + middle 进一步简化它并消除除法
      • 请注意,如果您只需要正数,scale 必须小于或等于 2*middle
      猜你喜欢
      • 2013-07-21
      • 2013-03-07
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多