随机的准确性

时间:2016-08-10 11:32:52

标签: .net random

我正在尝试对随机的收敛进行一些测试 0,1,2的平均值为1,因此长期运行我期望值减去1到零 它不会为零 - 即使使用Unit16.max
我差三点就好了。

我没有运行足够大的样本吗? 或随机关闭?
或者我的程序出了什么问题?

// private static System.Security.Cryptography.RNGCryptoServiceProvider rngCsp = new System.Security.Cryptography.RNGCryptoServiceProvider();
// this was not better than Random

Random ran = new Random();
public void RollEm()
{
    int sum = 0;
    int[] sums = new int[3];
    int val;
    int minVal = 0;
    int maxVal = 0;
    for (UInt32 i = 0; i < Int16.MaxValue; i++)
    {
        val = ran.Next(3);
        //val = (int)RollDice(3) - 1;
        sums[val]++;
        sum += val;
        sum--;
        if (sum < minVal)
            minVal = sum;
        if (sum > maxVal)
            maxVal = sum;

        if(i % 100 == 0)
            System.Diagnostics.Debug.WriteLine("i {0}  sum {1}  val {2}", i, sum, val);
        //System.Threading.Thread.Sleep(10);
    }
    System.Diagnostics.Debug.WriteLine("sum {0}   min {1}  max {2}", sum, minVal, maxVal);
    System.Diagnostics.Debug.WriteLine("sums {0}  {1}   {2}", sums[0], sums[1], sums[2]);
}

我同意关于平均值的评论和答案,不应该归零。我使用它进行扑克资金分析,所以总和对我来说很重要。

2 个答案:

答案 0 :(得分:2)

我做了一些测试:

Console.WriteLine(Enumerable.Range(0, Int16.MaxValue).Average(i => r.Next(3) - 1));

三次连续调用给出了这个输出:

-0,0075991088595233
0,00729392376476333
-0,00524918362987152

所以你看到平均值差不多是0

但连续三次打电话

Console.WriteLine(Enumerable.Range(0, Int16.MaxValue).Sum(i => r.Next(3) - 1));

给出

38
133
146

这意味着在Int16.MaxValue个随机数字中,例如比+1多133 -1。但是,平均值不是0,而是

所以&#34;错误&#34;在您的代码中,您要检查总和而不是平均值。您需要将300分开Int16.MaxValue除以+1

您可能认为减去1会导致平均值为-1而{{1}}应相互抵消,但是当您考虑它时:如果使用值 1到3 ,你的总和为2,但真的很有价值

答案 1 :(得分:0)

不,随机没有关闭。这只意味着在你总结的65536个数字中,大约300个是2比0。与你在那里做的骰子总数相比,实际上没有那么多。如果您执行无限骰子滚动,则您滚动的所有数字的算术平均值仅保证命中1。你已经有平均1个精确到两个小数位,这在这里肯定是足够好的。