我正在尝试对随机的收敛进行一些测试
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]);
}
我同意关于平均值的评论和答案,不应该归零。我使用它进行扑克资金分析,所以总和对我来说很重要。
答案 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个精确到两个小数位,这在这里肯定是足够好的。