我正在尝试模拟一个逼真的按键事件。出于这个原因,我使用的是 SendInput() 方法,但为了获得更好的结果,我需要指定 keyDOWN 和 KeyUP 事件之间的延迟!下面的这些数字显示了 DOWN 和 UP 事件之间经过的时间(以毫秒为单位)(这些是真实/有效的):
96 95 112 111 119 104 143 96 95 104 120 112 111 88 104 119 111 103 95 104 95 127 112 143 144 142 143 128 144 112 112 111111113111111135111411135111351C1114S11113111341C111134S1111111111111111 111 111 111 111 111 112 111 104 87 95
我们可以简化输出:
延迟 64 - 88 毫秒 -> 20% 的时间
延迟 89 - 135 毫秒 -> 60% 的时间
延迟 136 - 150 毫秒 -> 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
}
}
这段代码有一个很大的问题。理论上,经过数百万次迭代后 - 生成的图形将类似于以下内容:
如何处理这个问题?
编辑:解决方案是按照人们的建议使用分发。
这是此类代码的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
大家感谢帮助!