【问题标题】:WPF: Rendering a canvas at Random PointsWPF:在随机点渲染画布
【发布时间】:2010-10-07 18:15:19
【问题描述】:

参考this programming game我目前正在建设中。

当游戏开始时,我在画布上的随机点生成这些机器人,乍一看(同时添加一个或两个机器人),这似乎可以正常工作。

...但是,当我同时添加大量机器人时,它们是如何“随机”出现在画布上的:

alt text http://img22.imageshack.us/img22/6895/randombotpositionlf7.jpg

所谓的随机点似乎并不那么随机......它们只是直线上的点


这是我计算积分的方式:

SetStartingPoint(GetRandomPoint(ArenaWidth, ArenaHeight)); //the width and height are 550, 480 at the moment 

//which calls:

private Point GetRandomPoint(double maxWidth, double maxHeight)
{
        return new Point(new Random().Next(0, (int)(maxWidth-80)), new Random().Next(0, (int)maxHeight));
}

//and ultimately:

private void SetStartingPoint(Point p)
{
        Translate_Body.X = (double)p.X;
        Translate_Body.Y = (double)p.Y;
}

关于上面的代码,Translate_Body 是机器人的TranslateTransform 类型(canvas),因此通过分配它的XY 属性,它将其位置更改为新值


我在这里错过了什么?


[更新]解决方案:

问题就像你们都建议的那样,由于新的实例化,数字没有正确播种。

我现在将代码更改为使用单个 Random 变量并从中播种所有点。

但我仍然无法理解为什么在看似直线的坐标上生成点。 有人能解释一下吗?


【问题讨论】:

  • 你能提供更多的上下文吗?什么是 Translate_Body?您的画布的 XAML 是什么样的?
  • 我认为这与这种情况无关,但我仍然在我的帖子中添加了解释
  • 随机调用总是会产生相同的数字。我可以想象的一种情况是,您使用前一个“机器人”的坐标作为下一个机器人的起点并从那里偏移......

标签: wpf math random


【解决方案1】:

我认为问题在于您的随机数没有正确播种。使用 Random 的单个实例,而不是多个实例,您应该会看到很多改进。

用户添加了“为什么他们在一条直线上”——可能是因为基于种子生成的随机数的默认进展。 wikipedia 将是一个很好的起点——我不是数学专家,所以不会试图解释随机数世界的核心。 :)

【讨论】:

  • 它们在一条直线上,因为 X 和 Y 值始终相同。为什么它们会一样?因为每一个都是由一个 NEW Random() 对象生成的。由于它们是在完全相同的时间创建的,因此它们自然具有完全相同的值。
【解决方案2】:

问题是您不断创建新的 Random() 对象,然后获取第一个随机数。但是 Random() 对象是随时间初始化的,所以它总是得到相同的值。

改为这样做:

private System.Random R = new System.Random();
private Point GetRandomPoint(double maxWidth, double maxHeight)
{
    return new Point(R.Next(0, (int)(maxWidth - 80)), R.Next(0, (int)maxHeight));
}

这将创建一个 Random() 对象,然后重复调用它。这也会表现得更好,因为您没有初始化太多的对象。

【讨论】:

  • 其实我把R随机变量放在了方法本身,是为了避免把全局空间弄得乱七八糟。 (...是的,我知道,我深受 JavaScript 的影响)
  • 嗯...真的有用吗?在 C# 中,在方法中声明静态变量的语法是什么?我问是因为快速的网络搜索显示了许多希望 C# 具有这种能力的人的 cmets。 (作为一名前 C++ 程序员,我希望我也有这个能力)
【解决方案3】:

除了你应该使用Random 的一个实例而不是一直创建一个新种子之外,从这里看不到任何奇怪的东西。如果您的系统足够快,您可能会两次获得相同的种子。

如果这不能解决问题,请再次检查您的设置器以及受设置/绘制Translate_Body.XTranslate_Body.Y 影响的任何内容。我猜你画的时候,你画的是 (X,X) 或 (Y,Y) 而不是 (X,Y)...

【讨论】:

    【解决方案4】:

    默认情况下,Random 类使用当前时间作为种子。由于时间仅每几毫秒前进一次,因此您的大多数“随机”数字实际上将完全相同。只需构造一次 Random 对象,随后对 Next() 的调用应该会给您更多随机结果。

    【讨论】:

      猜你喜欢
      • 2022-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 2016-03-14
      • 2012-08-15
      • 2012-10-06
      相关资源
      最近更新 更多