【发布时间】:2011-05-05 00:17:42
【问题描述】:
我确定我做错了什么;但这已经让我发疯了一段时间。
我制作了一个小型 Silverlight 游戏(一个古老的 Galaxian 克隆)。当游戏开始时,大约 90% 的时间里,一堆星星随机放置在游戏区域中。有三种类型的恒星 - 较大的恒星速度更快,较小的恒星移动速度较慢。
看起来像这样:
~10% 的时间所有星星都出现在“带状”中
我认为值得一提的是,即使它们处于窄带中;他们并不都处于相同的确切位置。所以它就像在生成一个随机数——只是一个很小的数。
要重现该错误,我只需在浏览器中按“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
我看不出有什么问题。 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
编辑#2: 我非常感谢大家对此的想法/建议。
【问题讨论】:
-
您是否每次都从
GetRandom返回一个新的Random实例? -
为传递给 GetRandom.Next 函数的值添加一些日志记录。特别是 StarEdge、Width 等,以便您可以重现它。同时存储结果
-
显示您的
GetRandom课程。此外,虽然您在椭圆上设置了Height和Width属性,但您在哪里设置它的位置?你需要在某处设置myElipse.Location吗? -
就像 Adrian 提到的,保持使用相同的 Random 实例而不是每次都使用新实例很重要。否则,您将继续获得相同的结果。但我不认为这会是问题,但你有时只会得到它。但还是值得一提的
-
@RobP - 这里涉及很多线程吗?
Random不是线程安全的;例如,你对Parallel有什么帮助吗?
标签: .net vb.net silverlight random