在C#中生成具有平均值的随机数

时间:2018-09-14 03:52:52

标签: c# algorithm

请问,我如何在c#中编写一个方法,该方法可以随机生成6个具有预定义平均值以及最小和最大边界的数字?例如,该方法应能够生成位于1800和2400内的六个随机数,将它们相加并除以6将得到2000的平均值。该方法应接收所需的平均值,较高边界和较低边界作为参数。

Ps:我在matlab,Python等中看到了类似的现有问题,但是我无法翻译

1 个答案:

答案 0 :(得分:1)

您可以尝试以下简单方法:

生成范围为0..1的六个随机值

找到他们的平均值,最小值和最大值

带有线性公式的比例值

R[i] = NeededAverage - average + (r[i] - average) * 
            Math.Min((NeededMax - NeededAverage) / (max - average), 
                (NeededAverage - NeededMin) / (average - min))

在这种情况下,最小值或最大值位于范围的低边界或高边界。如果不需要,请在第二项中将min max替换为0和1。

快速的Python实现:

import random
def genrand(Mn, Mx, Ave):
    r = []
    for i in range(6):
        r.append(random.random())
    rmn = min(r)
    rmx = max(r)
    rave = sum(r) / len(r)
    cf = min((Mx - Ave) / (1.0 - rave), (Ave - Mn) / (rave))
    for i in range(6):
        r[i] = Ave - rave + (r[i] - rave) * cf
    return r

r = genrand(1800, 2400, 2000)
print(r, sum(r) / len(r))

>>[2046.9226390661588, 1958.1861543479467, 2086.1995475393196,
   1940.656019470334, 2095.468041407782, 1869.730314881107] 

   1999.5271194521083