Ale*_*lex 6 c# random simulation probability
我正在尝试模拟一个真实的按键事件.出于这个原因,我正在使用SendInput()方法,但为了获得更好的结果,我需要指定keyDOWN和KeyUP事件之间的延迟!下面的这些数字显示DOWN和UP事件之间经过的时间(以毫秒为单位)(这些是真实的/有效的):
96 95 112 111 119 104 143 96 95 104 120 112 111 88 104 119 111 103 142 143 128 144 112 111 112 120 128 111 135 118 147 96 135 103 64 64 87 79 112 88 111 111 112 111 104 87 95
我们可以简化输出:
延迟64 - 88 ms - > 20%的时间
延迟89 - 135 ms - > 60%的时间
延迟136 - 150 ms - > 20%的时间
如何根据上面的概率触发事件?这是我正在使用的代码:
private void button2_Click(object sender, EventArgs e)
{
textBox2.Focus();
Random r = new Random();
int rez = r.Next(0, 5); // 0,1,2,3,4 - five numbers total
if (rez == 0) // if 20% (1/5)
{
Random r2 = new Random();
textBox2.AppendText(" " + rez + " " + r2.Next(64, 88) + Environment.NewLine);
// do stuff
}
else if (rez == 4)//if 20% (1/5)
{
Random r3 = new Random();
textBox2.AppendText(" " + rez + " " + r3.Next(89, 135) + Environment.NewLine);
// do stuff
}
else // if 1 or 2 or 3 (3/5) -> 60%
{
Random r4 = new Random();
textBox2.AppendText(" " + rez + " " + r4.Next(136, 150) + Environment.NewLine);
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码存在很大问题.从理论上讲,经过数百万次迭代后,得到的图形看起来与此类似:

如何处理这个问题?
编辑:解决方案是使用人们建议的分发.
这里是java实现这样的代码:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian%28%29
这是C#实现:
虽然我建议稍微减少"偏差"的价值.
这是有趣的msdn文章
http://blogs.msdn.com/b/ericlippert/archive/2012/02/21/generating-random-non-uniform-data-in-c.aspx
大家感谢您的帮助!
听起来您需要生成正态分布。内置的 .NET 类生成Uniform Distribution。
通过使用Box-Muller 变换,可以使用内置的 Random 类来获得高斯或正态分布随机数。
你最终应该得到一个像这样的漂亮的概率曲线

(摘自http://en.wikipedia.org/wiki/Normal_distribution)
要将正态分布随机数转换为整数范围,Box-Muller 变换可以再次提供帮助。请参阅之前的问题和答案,其中描述了该过程以及数学证明的链接。