Случайное размещение врага на 2-й сетке

11

Я хочу разместить свои предметы и врагов случайным образом (или как можно более случайным образом). В данный момент я использую Randomкласс XNA для генерации числа от 800 для X и 600 для Y. Такое ощущение, что враги появляются в верхней части карты больше, чем в середине или внизу. Я не сею генератор, может быть, это то, что нужно учитывать.

Описаны ли другие методы, которые могут улучшить случайное размещение врага на двумерной сетке?

Робб
источник
Этот вопрос кажется неправильным. Вы хотите разместить вещи случайным образом, не используя источник случайных данных? Это противоречие. Чего вы на самом деле пытаетесь достичь?
Эндрю Рассел
Я хотел бы знать, есть ли какие-либо методы, кроме как полагаться на случайный класс XNA для генерации числа между min и max. Я постараюсь сделать более понятный вопрос
Робб
1
Класс Random, о котором вы говорите, является частью платформы .NET, а не XNA. Просто к вашему сведению.
Майкл Коулман
@ Омнион - я в курсе. Я немного устал при создании вопроса;)
Робб

Ответы:

16

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

amitp
источник
7

Shawn Hargreaves на помощь!

http://blogs.msdn.com/b/shawnhar/archive/2009/12/17/the-psychology-of-randomness.aspx http://blogs.msdn.com/b/shawnhar/archive/2010/09 /10/links-5-charles-bloom-on-randomness.aspx

Когда вы думаете о случайном распределении, вы действительно имеете в виду равномерное распределение. .Net Random думает случайным образом. Вам нужно что-то еще, чтобы выровнять его. Метод выборки диска Пуассона amitp, связанный с выглядит идеально подходит для ваших нужд.

Cubed2D
источник
+1 вынул слова прямо изо рта, даже распределение, кажется, постоянно смешивается со случайным распределением (я сам допустил одну и ту же ошибку)
Spooks
0

Следующий код C # сгенерирует для вас набор одинаковых точек:

Random rand = new Random(); // creates a new random number generator with a time-based seed
int X, Y;
for(int i = 0; i < numberOfPoints; i++)
{
  X = rand.Next(800); // generates a random int between 0 and 799, inclusive
  Y = rand.Next(600); // generates a random int between 0 and 599, inclusive
  AddPointToSet(X,Y); // write this method however you want
}

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

Джеймс Кинг
источник