Випадкове розміщення ворога на 2d сітці


11

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

Чи є інші описані методи, які можуть покращити розміщення випадкових ворогів у 2d сітці?


Це питання видається неправильним. Ви хочете розміщувати речі випадковим чином, не використовуючи джерело випадкових даних? Це суперечність. Чого ви насправді намагаєтесь досягти?
Ендрю Рассел

Мені хотілося б знати, чи існують якісь інші методи, крім того, щоб покластись на клас Random XNA, щоб генерувати число між min та max. Спробую поставити більш чітке запитання
Робб

1
Клас Random, про який ви говорите, є частиною рамки .NET, а не XNA. Просто фій.
Майкл Коулман

@Omnion - я знаю. Я трохи втомився, коли створював питання;)
Робб

Відповіді:


16

Випадкове розміщення не виглядає достатньо випадковим для очей. Ймовірно, ви хочете, щоб вороги були розподілені трохи рівномірно. Подивіться цю статтю про вибірку дисків Пуассона або прочитайте про синій шум.


7

Шон Харгріус на допомогу!

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's Random - мислення випадкове. Вам потрібно щось інше, щоб вирівняти це. Метод відбору дискретизації Пуассона, пов'язаний з ідеальним виглядом, ідеально підходить для ваших потреб.


+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 розміщується на основі часу, тому він буде по суті випадковим, якщо ви не будете робити це повторно з дуже невеликим часом між дзвінками.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.