c# - 为什么这些随机事件遵循特定的模式?
问题描述
我创建了一个网格布局。它显示 100 个球。最初,所有球将处于随机位置。每 25 毫秒,一个球会在随机方向上移动一些单元(这对所有球来说都是常见的)。您可以在下图中看到这一点:
尽管球的方向是随机的,但一段时间后,所有的球都会向右下角移动。这种行为每次都会重复。您可以在下图中看到这一点:
- 为什么这些随机事件遵循特定的模式?
- 随机数真的是随机的吗?
- C# 随机数生成器有问题吗?
- 对此有任何数学解释吗?
C# 代码
Random random = new Random();
var direction = random.NextDouble() * 360;
var ballTranslate = child.RenderTransform.TransformPoint(new Point(0, 0));
var x = ballTranslate.X;
var y = ballTranslate.Y;
var x1 = x + (parm.Speed * Math.Cos(direction));
while (x1 < 0 || x1 > (parm.CellSize * parm.NoOfSplit))
{
direction = random.NextDouble() * 360;
x1 = x + (parm.Speed * Math.Cos(direction));
}
var y1 = y + (parm.Speed * Math.Sin(direction));
while (y1 < 0 || y1 > (parm.CellSize * parm.NoOfSplit))
{
direction = random.NextDouble() * 360;
y1 = y + (parm.Speed * Math.Sin(direction));
}
TranslateTransform myTranslate = new TranslateTransform();
myTranslate.X = x1;
myTranslate.Y = y1;
child.RenderTransform = myTranslate;
完整代码
解决方案
您似乎正在生成一个以度为单位的方向并将其传递给 Math.Sin,它以弧度为单位。360/2PI = 57.3(大约),因此与其他更大的角度相比,您选择 0 到 0.3 弧度之间的角度的可能性略高。
当你有这么多迭代时,也有可能某处存在微小的舍入误差
推荐阅读
- python - Python多线程:如何在每次迭代中创建一个顺序线程来处理某些东西
- java - 布尔值是否隐含地为真?
- angular - VS Code 在 Angular getter 函数中找不到“get”的名称,有什么解决方法吗?
- azure - Azure 订阅已结束。我现在如何导出数据库?
- audio - 如何将文本文件中的原始音频样本转换为在每个点具有前导 n 前导频率的列表?
- spark-streaming - Databricks Delta 表更改十进制(10,0)到十进制(38,18)转换的列不起作用
- performance - 确定 95% 的请求所用时间不超过 1 秒,如果超过则自动停止测试
- python - 根据列表展开DataFrame并添加索引
- pocketsphinx - 如何从 Pocketsphinx 获得不错的结果?
- javascript - 如何设置程序执行的时间限制?