C# 固定平均随机数

C# 固定平均随机数,c#,.net,random,average,C#,.net,Random,Average,我想生成100个介于1和10之间的随机数。但这100个随机数的平均值应该是7。我该怎么做?我的工作如下: //generating random number Random random = new Random(); int value = random.Next(1,10); 并将每个值存储在一个数组中。如果数组中100个项目的平均值不是7,那么我需要获得另外100个随机数。有谁能建议一种更好的方法吗?这种方法生成一个随机数序列,然后不断加/减,直到我们得到正确的总数(700),只要我们要

我想生成100个介于1和10之间的随机数。但这100个随机数的平均值应该是7。我该怎么做?我的工作如下:

//generating random number
Random random = new Random();
int value = random.Next(1,10);

并将每个值存储在一个数组中。如果数组中100个项目的平均值不是7,那么我需要获得另外100个随机数。有谁能建议一种更好的方法吗?

这种方法生成一个随机数序列,然后不断加/减,直到我们得到正确的总数(700),只要我们要更改的数字仍然在1-10之间

List<int> randomNumbers = new List<int>();
for (int i = 0; i < 100; i++) {
    numbers.Add(r.Next(1, 10));
}

int total = randomNumbers.Sum();

// Now fiddle until we get the correct total (700)

if (total < 700) {
    while (total < 700) {
        for (int i = 0; i < 100; i++) {
            if (numbers[i] < 10) {
                numbers[i]++;
                total = randomNumbers.Sum();
                if (total == 700) break;
            }
        }
    }
}

else if (total > 700) {
    while (total > 700) {
        for (int i = 99; i >= 0; i--) {
            if (numbers[i] > 0) {
                numbers[i]--;
                total = randomNumbers.Sum();
                if (total == 700) break;
            }
        }
    }
}
List randomNumbers=新列表();
对于(int i=0;i<100;i++){
添加(r.Next(1,10));
}
int total=randomNumbers.Sum();
//现在摆弄直到我们得到正确的总数(700)
如果(总数<700){
而(总数<700){
对于(int i=0;i<100;i++){
如果(数字[i]<10){
数字[i]++;
总数=随机数。总和();
如果(总==700)断裂;
}
}
}
}
否则,如果(总数>700){
而(总数>700){
对于(int i=99;i>=0;i--){
如果(数字[i]>0){
数字[i]——;
总数=随机数。总和();
如果(总==700)断裂;
}
}
}
}

好的,这样做可能很棘手

如果你需要得到100个不同的数字,你需要它们的平均值是7,你需要它们加起来700

您需要跟踪每个数字及其总数。虽然700减去迄今为止获得的值之和小于10*您尚未获得的数字量,但您可以继续获得纯随机值

当获得的值总和小于需要获得的值时,将最后一个数字改为10,在列表末尾需要的其余数字中加10,在最后一个数字上,得到700和之前99个伪随机值之和之间的差值

洗牌你的数组等等,你有一个100个伪随机数组,数字从1到10,平均值是7。当然,它的10秒数比预期的要多,但你肯定能够对这个“算法”进行微调,使其不太容易出现10秒


嗯,等一下,如果你得到的随机值的平均值高于7怎么办?您还需要跟踪当前值的总和是否小于尚未获得的数字。如果您在任何时候超过此值,则需要将您的最后一个数字转换为1,在所需的其他值上加1,然后再次获得您的最后一个数字,作为700和99个早期值之间的差值。

类似的操作可能会做到这一点:

public static void Main(string[] args)
    {
        var randomList = new List<int>();
        var random = new Random();
        var avg = 0;
        while (avg != 7)
        {
            randomList = new List<int>();
            GenerateList(randomList, random);
            avg = (int) randomList.Average();
        }

        for (var i = 0; i < randomList.Count; i++)
        {
            Console.WriteLine(string.Format("Index: {0}, Number: {1}", i, randomList.ElementAt(i)));
        }
    }

    private static void GenerateList(List<int> refList, Random random)
    {
        for (var i = 0; i < 100; i++)
        {
            refList.Add(random.Next(1, 10));
        }
    }
publicstaticvoidmain(字符串[]args)
{
var randomList=新列表();
var random=新的random();
var平均值=0;
而(平均!=7)
{
随机列表=新列表();
生成列表(随机列表,随机);
avg=(int)randomList.Average();
}
对于(var i=0;i
在没有附加参数的情况下,上述算法满足每一个需求

  • 返回值必须介于1和10之间
  • 多个调用的平均值必须趋向于7,因为n趋向于inf
  • 编辑因为这个答案有太多争议…我添加了这个答案…这绝对是随机的

    public List<int> ProduceRandom100NumbersWithAverageOfSeven()
    {
        var rand = new Random();
        var seed = rand.Next();
        if(seed > 0.5)
        {
            return new List(Enumerable.Concat(
                     Enumerable.Repeat(6, 50),
                     Enumerable.Repeat(8, 50)));
        }
        else
        {
            return new List(Enumerable.Concat(
                     Enumerable.Repeat(8, 50),
                     Enumerable.Repeat(6, 50)));
    
        }
    }
    
    公共列表生成的随机数为100个,平均数为偶数()
    {
    var rand=new Random();
    var seed=rand.Next();
    如果(种子>0.5)
    {
    返回新列表(Enumerable.Concat)(
    可枚举。重复(6,50),
    可枚举。重复(8,50));
    }
    其他的
    {
    返回新列表(Enumerable.Concat)(
    可枚举。重复(8,50),
    可枚举。重复(6,50));
    }
    }
    
    编辑:将代码更改为“始终”时,平均值正好为7

    这基本上是您已经在做的优化版本。在进行检查之前,它只生成10个数字,而不是再生成100个数字

    using System.Collections.Generic;
    using System.Linq;
    

    var r=new Random();
    变量编号=新列表();
    while(number.Count<100)
    {
    var stack=新堆栈();
    对于(int i=0;i<10;i++)
    {
    堆栈推送(r.Next(10));
    }
    if(stack.Sum()==70)
    {
    数字。添加范围(堆栈);
    }
    }
    Console.WriteLine(number.Average());
    
    我的2美分

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch watch = Stopwatch.StartNew();
    
                int count = 100;
                Double min = 0;
                Double max = 10;
                Double target = 7;
                Double tolerance = 0.00000001;
                Double minAverage = target - tolerance;
                Double maxAverage = target + tolerance;
    
                Random r = new Random();
                List<Double> numbers = new List<double>();
                Double sum = 0;
                for (int i = 0; i < count; i++)
                {
                    Double d = RangedDouble(min, max, r);
                    numbers.Add(d);
                    sum += d;
                }
    
    
                int Adjustments = 0;
    
                while((sum / count < minAverage || (sum / count) > maxAverage))
                {
                    while ((sum / count) < minAverage)
                    {
                        Double oldDbl = numbers.First(d => d < minAverage);
                        Double newDbl = oldDbl + RangedDouble(minAverage - oldDbl, 10 - oldDbl, r);
    
                        numbers.Remove(oldDbl);
                        sum -= oldDbl;
                        numbers.Add(newDbl);
                        sum += newDbl;
                        Adjustments++;
                    }
    
                    while ((sum / count) > maxAverage)
                    {
                        Double oldDbl = numbers.First(d => d > maxAverage);
                        Double newDbl = oldDbl - RangedDouble(oldDbl - maxAverage, oldDbl, r);
    
                        numbers.Remove(oldDbl);
                        sum -= oldDbl;
                        numbers.Add(newDbl);
                        sum += newDbl;
                        Adjustments++;
                    }
                }
                watch.Stop();
    
                int x = 0;
                while (x < count)
                {
                    Console.WriteLine("{0:F7}  {1:F7}  {2:F7}  {3:F7}", numbers.Skip(x).Take(1).First(), numbers.Skip(x + 1).Take(1).First(), numbers.Skip(x + 2).Take(1).First(), numbers.Skip(x + 3).Take(1).First());
                    x += 4;
                }
    
                Console.WriteLine();
                Console.WriteLine(watch.ElapsedMilliseconds);
                Console.WriteLine(numbers.Average());
                Console.WriteLine(Adjustments);
                Console.ReadKey(true);
            }
    
            private static double RangedDouble(Double min, Double max, Random r)
            {
                return (r.NextDouble() * (max - min) + min);
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用系统诊断;
    使用System.Linq;
    命名空间控制台应用程序1
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    秒表=Stopwatch.StartNew();
    整数计数=100;
    双最小值=0;
    双倍最大值=10;
    双目标=7;
    双公差=0.00000001;
    双平均值=目标-公差;
    双倍最大平均值=目标值+公差;
    随机r=新随机();
    列表编号=新列表();
    双和=0;
    for(int i=0;i最大平均值))
    {
    而((总和/计数)dvar r = new Random();
    var numbers = new List<int>();
    
    while (numbers.Count < 100)
    {
        var stack = new Stack<int>();
        for (int i = 0; i < 10; i++)
        {
            stack.Push(r.Next(10));
        }
    
        if (stack.Sum() == 70)
        {
            numbers.AddRange(stack);
        }
    }
    
    Console.WriteLine(numbers.Average());
    
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch watch = Stopwatch.StartNew();
    
                int count = 100;
                Double min = 0;
                Double max = 10;
                Double target = 7;
                Double tolerance = 0.00000001;
                Double minAverage = target - tolerance;
                Double maxAverage = target + tolerance;
    
                Random r = new Random();
                List<Double> numbers = new List<double>();
                Double sum = 0;
                for (int i = 0; i < count; i++)
                {
                    Double d = RangedDouble(min, max, r);
                    numbers.Add(d);
                    sum += d;
                }
    
    
                int Adjustments = 0;
    
                while((sum / count < minAverage || (sum / count) > maxAverage))
                {
                    while ((sum / count) < minAverage)
                    {
                        Double oldDbl = numbers.First(d => d < minAverage);
                        Double newDbl = oldDbl + RangedDouble(minAverage - oldDbl, 10 - oldDbl, r);
    
                        numbers.Remove(oldDbl);
                        sum -= oldDbl;
                        numbers.Add(newDbl);
                        sum += newDbl;
                        Adjustments++;
                    }
    
                    while ((sum / count) > maxAverage)
                    {
                        Double oldDbl = numbers.First(d => d > maxAverage);
                        Double newDbl = oldDbl - RangedDouble(oldDbl - maxAverage, oldDbl, r);
    
                        numbers.Remove(oldDbl);
                        sum -= oldDbl;
                        numbers.Add(newDbl);
                        sum += newDbl;
                        Adjustments++;
                    }
                }
                watch.Stop();
    
                int x = 0;
                while (x < count)
                {
                    Console.WriteLine("{0:F7}  {1:F7}  {2:F7}  {3:F7}", numbers.Skip(x).Take(1).First(), numbers.Skip(x + 1).Take(1).First(), numbers.Skip(x + 2).Take(1).First(), numbers.Skip(x + 3).Take(1).First());
                    x += 4;
                }
    
                Console.WriteLine();
                Console.WriteLine(watch.ElapsedMilliseconds);
                Console.WriteLine(numbers.Average());
                Console.WriteLine(Adjustments);
                Console.ReadKey(true);
            }
    
            private static double RangedDouble(Double min, Double max, Random r)
            {
                return (r.NextDouble() * (max - min) + min);
            }
        }
    }
    
    rand 1 s = [s]
    
    length x + length y = n
    sum x + sum y = s
    1  * length x <= sum x  -- Minimum value is 1
    10 * length x >= sum x  -- Maximum value is 10
    1  * length y <= sum y
    10 * length y >= sum y
    
    length x = lx
    length y = n - lx = ly
    
    sum x + sum y = s
    1  * lx <= sum x
    10 * lx >= sum x
    1  * ly <= sum y
    10 * ly >= sum y
    
    1  * lx <= sum x
    10 * lx >= sum x
    1  * ly <= s - sum x
    10 * ly >= s - sum x
    
    sum x + 1  * ly <= s
    sum x + 10 * ly >= s
    
    sum x <= s - 1  * ly
    sum x >= s - 10 * ly
    
    max (1  * lx) (s - 10 * ly) <= sum x
    min (10 * lx) (s - 1  * ly) >= sum x
    
    sum x = B
    sum y = s - B
    
    rand n s = let lx    = round (n / 2)
                   ly    = n - lx
                   lower = max (1  * lx) (s - 10 * ly)
                   upper = min (10 * lx) (s - 1  * ly)
                   b     = randInt lower upper
               in rand lx b ++ rand ly (s - b)
    
    myList = rand 100 700
    
    def rand(n, s):
        if n == 1:
            return [s]
        lx    = int(n / 2)
        ly    = n - lx
        lower = max(1  * lx, s - 10 * ly)
        upper = min(10 * lx, s - 1  * ly)
        b     = randint(lower, upper)
        result = rand(lx, b)
        result.extend(rand(ly, s - b))
        return result
    
    -- Generate one number then recurse
    rand 1 s = [s]
    rand n s = let ly    = n - 1
                   lower = max 1  (s - 10 * ly)
                   upper = min 10 (s - 1  * ly)
                   x     = randInt lower upper
                in x : rand (n - 1) s
    
    rand' xs 1 s = s:xs
    rand' xs n s = let ly    = n - 1
                       lower = max 1  (s - 10 * ly)
                       upper = min 10 (s - 1  * ly)
                       x     = randInt lower upper
                    in rand' (x:xs) (n-1) s
    rand = rand' []
    
    public void ProccessGenerateData(WorkBook workBookData, out List<double> nomreList, out int adjustmentsVal)
    {
        try
        {
            nomreList = new List<double>();
            adjustmentsVal = 0;           
            int count = workBookData.NumberStudents;
            double min = workBookData.Min;
            double max = workBookData.Max;               
            double target = workBookData.FixedAvg;
            double tolerance = workBookData.Tolerance;
            double minAverage = Math.Round(target - tolerance, 2);
            double maxAverage = Math.Round(target + tolerance, 2);
    
            Random r = new Random(DateTime.Now.Millisecond);
            List<double> listNomre = new List<double>();
            double sum = 0;
            for (int i = 0; i < count; i++)
            {
                double d = Math.Round(RangedDouble(min, max, r), 2);
                listNomre.Add(d);
                sum += d;
                sum = Math.Round(sum, 2);
            }
    
            int adjustments = 0;
    
            while (Math.Round((sum / count), 2) < minAverage || Math.Round((sum / count), 2) > maxAverage)
            {
    
                if (Math.Round((sum / count), 2) < minAverage)
                {
                    double oldDbl1 = listNomre.First(d => d < minAverage);
                    //min<a1+x1<max --> a1 is oldDbl1 , x1 --> Unknown
                    double newDbl1 = Math.Round(oldDbl1 + RangedDouble(min-oldDbl1, max - oldDbl1, r), 2);
    
                    listNomre.Remove(oldDbl1);
                    sum -= oldDbl1;
                    sum = Math.Round(sum, 2);
                    listNomre.Add(newDbl1);
                    sum += newDbl1;
                    sum = Math.Round(sum, 2);
                    adjustments++;
                    continue;
                }
                double oldDbl = listNomre.First(d => d > maxAverage);
                //min<a1-x1<max --> a1 is oldDbl , x1 --> Unknown
                double newDbl = Math.Round(oldDbl - RangedDouble(oldDbl-max, oldDbl - min, r), 2);
                listNomre.Remove(oldDbl);
                sum -= oldDbl;
                sum = Math.Round(sum, 2);
                listNomre.Add(newDbl);
                sum += newDbl;
                sum = Math.Round(sum, 2);
                adjustments++;
            }
    
            nomreList = listNomre;
            adjustmentsVal = adjustments;     
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            throw;
        }
    }
    
    private static double RangedDouble(double min, double max, Random r)
    {
        //Function RangedDouble => Random Number Between 2 Double Numbers
        //Random.NextDouble => returns a double between 0 and 1
        return Math.Round( r.NextDouble() * (max - min) + min,2);
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var rnd = new Random();
            var min = 1;
            var max = 20;
            var avg = 15;
    
            var count = 5000;
    
            var numbers = new List<int>();
    
            for (var i = 0; i < count; i++)
            {
                var random1 = rnd.Next(min, avg + 1);
                var random2 = rnd.Next(avg + 2, max + 1);
                var randoms = new List<int>();
                randoms.AddRange(Enumerable.Repeat<int>(random2, avg - min));
                randoms.AddRange(Enumerable.Repeat<int>(random1, max - avg));
    
                var generatedNumber = randoms[rnd.Next(randoms.Count)];
                numbers.Add(generatedNumber);
            }
    
            numbers = numbers.OrderBy(x => x).ToList();
            var groups = numbers.GroupBy(x => x).OrderByDescending(x => x.Count()).ToList();
            groups.ForEach(x => Console.WriteLine($"{x.Key}: {x.Count()}"));
            Console.WriteLine($"Average: {numbers.Average(x => x)}");
            Console.WriteLine($"Count of numbers: {groups.Count}");
        }
    }