奇怪的随机数Bug .Net

Rob*_* P. 10 .net vb.net random silverlight

我确定我做错了什么; 但这已经让我疯狂一段时间了.

我做了一个小型的Silverlight游戏(旧的Galaxian克隆).当游戏开始~90%的时候,一堆星星随机定位在游戏区域.有三种类型的恒星 - 更大的恒星更快,更小的恒星运动更慢.

它看起来像这样:

ScreenShot1

大约10%的时间所有星星出现在'乐队'中 ScreenShot2

我认为值得一提的是,即使它们处于狭窄的范围内; 他们并非都处于同一个位置.所以它就像它仍然生成一个随机数 - 只是一个小数字.

要重现错误,我只需在浏览器中点击"f5"即可.几乎所有时间,它都按预期工作.很少,我得到乐队.再次点击'f5'将解决问题.

没有张贴巨大的代码墙; 我认为这是最相关的代码.它出现在Base类中,我的所有星星都继承自.当每个星星被创建时,它会被调用一次.

Protected Sub SetInitialPosition()
    myElipse.Height = GetStarSize()
    myElipse.Width = GetStarSize()

    _location.X = GetRandom.Next(-1 * Settings.StarEdge, CType(GameCanvas.Width, Integer) + Settings.StarEdge)
    _location.Y = GetRandom.Next(0, CType(GameCanvas.Height, Integer))

    myElipse.Fill = New SolidColorBrush(GetStarColor)

End Sub
Run Code Online (Sandbox Code Playgroud)

我没有看到任何错误.GetRandom()返回一个单例Random类,我依赖于GameCanvas.Height和GameCanvas.Width是有效的 - 但同样,.Width似乎完全按预期工作.

有没有人对这种行为有可能的解释?生成随机数时是否有任何需要注意的问题?每次我单步执行代码,一切都很好,游戏按预期工作.

如果有帮助我可以发布游戏链接.
(http://robdude.weebly.com/cci.html)

编辑#1:
这是来自GetRandom()的代码

Protected Shared Function GetRandom() As Random
    If _random Is Nothing Then _random = New Random()

    Return _random
End Function
Run Code Online (Sandbox Code Playgroud)

编辑#2: 我非常感谢大家对此的想法/建议.

Rob*_* P. 4

我想让这个答案尽可能通用,希望对其他人有帮助。我在这里整合了其他答案(以及我的问题的实际解决方案),这可能对遇到随机生成数字的奇怪行为的人有所帮助。

使用不同的 Random 实例

Random 类的实例有一个关联的种子。一般来说,您希望重用相同的 Random 实例或确保种子不同。如果您使用相同的种子创建了 2 个不同的 Random 实例,则第一个 .Next 将返回相同的结果。

线程安全

随机不是线程安全的。

条件断点

我有时会忘记这是一个选择。在某些情况下,“单步执行代码”的行为会隐藏运行时出现的错误。设置条件断点是检查这一点的好方法。就我而言,“CType(GameCanvas.Height, Integer) < 750”是我使用的条件。

记录

同样,日志记录对于像这样的错误来说是非常宝贵的。我不知道为什么我在问这个问题之前没有想到这一点。

最后,由于我不明白的原因,很少情况下, 的值GameCanvas.Height设置不正确。我的理论是,当我创建/定位/调整 GameCanvas 的大小时,我在其他地方错误地或不恰当地做了其他事情。

逐行浏览代码似乎无法解决问题。在我的情况下,比赛场地的大小是固定的;因此,我现在不再从 GameCanvas 控件中检查大小,而是从“设置”对象中提取它。

感谢大家的团队调试。非常感谢。