WPF:在随机点渲染画布

时间:2009-02-15 16:30:52

标签: wpf math random

参考我目前正在制作的this programming game

当游戏开始时,我在Canvas上假设随机点生成这些机器人,并且首先看(同时添加一个或两个机器人),这似乎正常工作。

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

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变量并从中获取所有点。

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


4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

问题是你不断创建新的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()对象,然后重复调用它。这也会表现得更好,因为你没有初始化很多对象。

答案 3 :(得分:0)

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

如果这样做无法解决问题,请再次检查您的设置者以及受设置/绘制Translate_Body.XTranslate_Body.Y影响的所有内容。我在猜你画画的时候,你画的是(X,X)或(Y,Y)而不是(X,Y)......