WPF: рендеринг холста в случайных точках

Что касается этой игры по программированию Я сейчас занимаюсь строительством.

Когда игра запускается, я генерирую этих роботов в предположительно случайных точках на холсте, и на первый взгляд (добавление одного или двух ботов одновременно) казалось, что это работает как надо.

... но, когда я добавил кучу ботов одновременно, вот как они "случайным образом" появились на холсте:

альтернативный текст 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), поэтому, назначив его свойства X и Y, он изменит свое положение на новые значения.


Что мне здесь не хватает?


[ОБНОВЛЕНИЕ] Решение:

Проблема заключалась в том, что, как вы все предположили, номера не были правильно засеяны из-за новых экземпляров.

Теперь я изменил код, чтобы использовать одну переменную Random и засеять из нее все точки.

Но я все еще не могу понять, почему точки генерируются с кажущейся прямой линией координат. Кто-нибудь может это объяснить?



person Andreas Grech    schedule 15.02.2009    source источник
comment
Не могли бы вы дать еще контекст? Что такое Translate_Body? Как выглядит XAML для вашего холста?   -  person DavidN    schedule 15.02.2009
comment
Я не думаю, что это актуально в данном случае, но все же я добавил объяснение в свой пост   -  person Andreas Grech    schedule 15.02.2009
comment
Случайные вызовы всегда будут генерировать одно и то же число. Один сценарий, который я могу представить, заключается в том, что вы использовали координаты предыдущего бота в качестве отправной точки следующего бота и смещали оттуда ...   -  person DavidN    schedule 15.02.2009


Ответы (4)


Я считаю, что проблема в том, что ваши случайные числа не засеиваются должным образом. Используйте один экземпляр Random, а не несколько, и вы увидите значительное улучшение.

Пользователь добавил «почему они оказались на прямой линии» - вероятно, из-за стандартной последовательности сгенерированных случайных чисел на основе начального числа. wikipedia было бы хорошим местом для начала - я не специалист по математике, поэтому выиграл » Я пытаюсь объяснить суть мира случайных чисел. :)

person Dominic Hopton    schedule 15.02.2009
comment
Они находятся на прямой линии, потому что значения X и Y всегда одинаковы. Почему они должны быть такими же? Потому что каждый из них генерируется НОВЫМ объектом Random (). поскольку они создаются в одно и то же время, они, естественно, имеют одинаковую ценность. - person SunriseProgrammer; 16.02.2009

По умолчанию класс Random использует текущее время в качестве начального числа. Поскольку время увеличивается только каждые несколько миллисекунд, большинство ваших «случайных» чисел на самом деле будут точно такими же. Создайте свой объект Random только один раз, и последующие вызовы Next () должны дать вам больше случайных результатов.

person Jim Arnold    schedule 15.02.2009

Проблема в том, что вы продолжаете создавать новые объекты 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 (), а затем вызовет его повторно. Это также будет работать лучше, потому что вы не инициализируете так много объектов.

person SunriseProgrammer    schedule 15.02.2009
comment
Собственно, случайную переменную R я поместил в сам метод, чтобы не загромождать глобальное пространство. (... да, я знаю, на меня сильно влияет JavaScript) - person Andreas Grech; 15.02.2009
comment
Эмм ... это действительно работает? Каков синтаксис для объявления в C # статической переменной внутри метода? Я спрашиваю, потому что быстрый поиск в Интернете показывает множество комментариев от людей, желающих, чтобы у C # была такая возможность. (И как бывший программист на C ++, я тоже хотел бы иметь такую ​​возможность) - person SunriseProgrammer; 16.02.2009

Не вижу здесь ничего странного, кроме того, что вы должны использовать один экземпляр Random вместо того, чтобы все время создавать новое семя. Если ваша система достаточно быстрая, возможно, вы оба раза получаете одно и то же семя.

Если это не поможет, проверьте свои сеттеры и все, на что влияет установка / рисование Translate_Body.X и Translate_Body.Y еще раз. Я предполагаю, что когда вы его рисуете, вы рисуете в (X, X) или (Y, Y) вместо (X, Y) ...

person lc.    schedule 15.02.2009