C# 用于平均扭曲值的数学

C# 用于平均扭曲值的数学,c#,math,C#,Math,我得到了一些随机扭曲的值,现在我正在寻找一种平均扭曲的方法 在下面的代码中,我有一个问题的示例,一个测量值数组a[]。我得到了一个随机数组失真[]。这是由rnd.Nextbytes创建的 对于数组b[],我尝试接近数组a[]的值 在samplecode中,我使用了10.000个样本,但它不是真正固定的,100.000个样本也可以,最后我宁愿让它运行一段时间或直到按下一个键 using System; namespace test_math { class Program { static

我得到了一些随机扭曲的值,现在我正在寻找一种平均扭曲的方法

在下面的代码中,我有一个问题的示例,一个测量值数组a[]。我得到了一个随机数组失真[]。这是由rnd.Nextbytes创建的

对于数组b[],我尝试接近数组a[]的值

在samplecode中,我使用了10.000个样本,但它不是真正固定的,100.000个样本也可以,最后我宁愿让它运行一段时间或直到按下一个键

using System;
namespace test_math
{
class Program
{
    static void Main(string[] args)
    {
        Random rnd = new Random();
        byte[] distortion = new byte[8];

        int[] b = { 0, 0, 0, 0, 0, 0, 0, 0 };
        int[] a = { 100, 200, 300, 400, 500, 600, 700, 800 };

        for (int count = 0; count < 100000; count++)
        {
            Console.Write(count+ "  ");
            rnd.NextBytes(distortion);              
            for (int i = 0; i < distortion.Length; i++)
            {
                b[i] = (int)(b[i] * .8 + (a[i] + 127-(int)(distortion[i])) * .2);
                Console.Write(b[i].ToString() + " ");
            }
            Console.WriteLine();
        }
        Console.ReadLine();
    }
  }
 }
其中.8和.2是因子(我也用其他数字进行了测试)。 但我确实认为这远非理想,尽管这种数学方法有抑制作用,但它没有考虑到在某个时间点,新的测量方法对b的平均值影响较小


PS我现在不知道如何用统计术语来称呼这个接近某个值,如果有一个术语,我也很高兴知道它。

我仍然不完全清楚你的目标是什么。然而,从数学上讲,我希望这个想法应该是随着时间的推移平均样本数。从字面上看,这意味着你只需在每次迭代中将它们相加,然后找到收敛值,除以总样本数

这个版本的代码可以做到这一点(我对您的输出逻辑有点随意,这样代码可以在合理的时间内完成,而不会填满控制台窗口缓冲区):

static void Main(字符串[]args)
{
随机rnd=新随机();
字节[]失真=新字节[8];
long[]b={0,0,0,0,0,0,0,0};
int[]a={100200300400500600700800};

对于(int count=1;count不清楚你在问什么。具体来说,不清楚上面给出了什么部分,要求的结果是什么,以及上面的哪部分代表了你试图从给出的结果中得到要求的结果的失败尝试。随着时间的推移,似乎很清楚,假设一个良好的随机分布,这些值应该收敛于正确的值。但就改进现有内容而言,还不清楚您的目标是什么。代码现在到底在做什么,与您希望它做的有多大的不同?在上面的代码中,b[]不收敛于a[],本质上a[n]被[n]+随机(-127..+127)扭曲我在寻找数学,当用[n]+随机数重复足够多次时,会将b[]收敛到a[]的原始值。因此b[]表示{100200300400500600700800}。该代码只是一个易于复制且可编辑的问题示例。该代码在统计数据中有名称吗?该代码与您在评论中建议的其他选项是否存在行为差异。如果该代码运行良好,则与您在评论中建议的其他选项是否存在行为差异(会聚得更快吗?)situation@user3800527:“它在统计学中有名字吗”--不知道。我不是统计学家。:“会有行为上的差异吗”--没有区别。从数学上讲,这两种方法是相同的。只是在一种情况下,当你想显示当前进度时,你只计算平均值,而在另一种情况下,每次迭代你都会有效地重新计算平均值。在这两种情况下,收敛速度都非常快;在100次迭代后,你的平均值大约在10%,1000次迭代,接近1%。请注意,如果您选择运行平均方法,您需要将运行平均值存储为
double
,否则舍入误差会干扰收敛。我刚从一位朋友那里听说,在工程中,他们称之为PID控制。在统计中,我认为它可能只是平均值。它甚至可能更快地达到平均水平,但我发现它足够快了。
  b[i] = (int)(b[i] * .8 + (a[i] + 127-(int)(distortion[i])) * .2);
static void Main(string[] args)
{
    Random rnd = new Random();
    byte[] distortion = new byte[8];

    long[] b = { 0, 0, 0, 0, 0, 0, 0, 0 };
    int[] a = { 100, 200, 300, 400, 500, 600, 700, 800 };

    for (int count = 1; count <= 100000; count++)
    {
        bool display = count % 100 == 0;

        if (display)
        {
            Console.Write(count + "  ");
        }
        rnd.NextBytes(distortion);
        for (int i = 0; i < distortion.Length; i++)
        {
            int distortedValue = a[i] + 127 - (int)(distortion[i]);

            b[i] += distortedValue;

            if (display)
            {
                Console.Write(((int)((double)b[i] / count + 0.5)).ToString() + " ");
            }
        }

        if (display)
        {
            Console.WriteLine();
        }
    }
    Console.ReadLine();
}