c# - 用C#以一定概率触发事件

标签 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 95 104 95 127 112 143 144 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 毫秒 -> 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

            }

        }

这段代码有一个大问题。理论上,经过数百万次迭代后,生成的图形将类似于以下内容:

comparison

如何处理这个问题?

编辑:解决方案是按照人们的建议使用分发。

这里是此类代码的java实现:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian%28%29

这是 C# 实现:

How to generate normally distributed random from an integer range?

尽管我建议稍微降低“偏差”的值。

这是一篇有趣的 msdn 文章

http://blogs.msdn.com/b/ericlippert/archive/2012/02/21/generating-random-non-uniform-data-in-c.aspx

谢谢大家的帮助!

最佳答案

听起来您需要生成正态分布。内置 .NET 类生成一个 Uniform Distribution .

通过使用 Box-Muller transform 可以使用内置的 Random 类生成高斯或正态分布随机数。 .

你最终应该得到这样一条漂亮的概率曲线

Normal Distribution

(取自http://en.wikipedia.org/wiki/Normal_distribution)

要将正态分布的随机数转换为整数范围,Box-Muller 转换可以再次提供帮助。看这个previous question and answer它描述了过程和数学证明的链接。

关于c# - 用C#以一定概率触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10382229/

相关文章:

c# - 使用C#.Net连接到hadoop集群

c# - 我需要在配置文件中转义反斜杠吗?

matrix - 如何生成每个行和列的总和为零的矩阵

ruby - 生成随机字符串并保存到文件

loops - 在 Mathematica : multiple outputs 中循环

c# - Graphics.DrawIcon 忽略比例变换?

c# - 在 64 位环境中将指定的 NUnit 测试作为 32 位进程运行

python - 在python中生成分类数据集

python - 如何在Python中对刚体进行3D稳定堆叠

Java:与正方形(用于拖动)、线条(用于链接正方形)和动画(正方形跟随线条)的界面