Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Andreas GrechОтветов: 4

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

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

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

альтернативный текст 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 и засеять из нее все точки.

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


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

randomwpfmath

Ответы

Ответ 1 · рейтинг 3 · Dominic Hopton

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

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

Ответ 2 · рейтинг 1 · Jim Arnold

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

Ответ 3 · рейтинг 1 · SunriseProgrammer

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

Ответ 4 · lc.

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы