Losowe rozmieszczenie wroga na siatce 2d

11

Chcę umieścić moje przedmioty i wrogów losowo (lub tak losowo, jak to możliwe). W tej chwili używam Randomklasy XNA do generowania liczby od 800 dla X do 600 dla Y. Wydaje się, że wrogowie odradzają się bardziej na górze mapy niż na środku lub na dole. Nie uruchamiam generatora, może to jest coś do rozważenia.

Czy opisano inne techniki, które mogą poprawić losowe rozmieszczenie wrogów na siatce 2D?

Robb
źródło
To pytanie wydaje się źle sformułowane. Chcesz umieszczać rzeczy losowo, bez korzystania ze źródła losowych danych? To jest sprzeczność. Co tak naprawdę próbujesz osiągnąć?
Andrew Russell,
Chciałbym wiedzieć, czy istnieją inne techniki niż poleganie na klasie losowej XNA w celu wygenerowania liczby między min. A maks. Spróbuję odpowiedzieć na bardziej jednoznaczne pytanie
Robb
1
Klasa Random, o której mówisz, jest częścią frameworka .NET, a nie XNA. Po prostu fyi.
Michael Coleman,
@Omnion - Jestem tego świadomy. Byłem trochę zmęczony, gdy tworzyłem pytanie;)
Robb

Odpowiedzi:

16

Losowe rozmieszczenie nie wygląda wystarczająco przypadkowo dla oka. Prawdopodobnie będziesz chciał, aby wrogowie byli rozmieszczeni bardziej równomiernie. Spójrz w tym artykule na temat pobierania próbek dysku Poissona, albo przeczytać o niebieskim hałasu.

amitp
źródło
7

Shawn Hargreaves ratuje!

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

Kiedy myślisz o losowej dystrybucji, naprawdę masz na myśli równomierną dystrybucję. Random .Net myśli losowo. Potrzebujesz czegoś innego, aby to wyrównać. Metoda próbkowania dysku Poissona połączona z wygląda idealnie dla twoich potrzeb.

Cubed2D
źródło
+1 wyjęło mi słowa z ust, nawet dystrybucja wydaje się mieszać z losową dystrybucją przez cały czas (ja sam popełniłem ten sam błąd)
Spooks
0

Poniższy kod C # wygeneruje dla Ciebie zestaw jednolitych punktów:

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
}

Zauważ, że kiedy używasz konstruktora Random () bez parametrów, tworzony obiekt Random jest rozstawiany na podstawie czasu, więc będzie zasadniczo losowy, chyba że będziesz robił to wielokrotnie, z bardzo krótkim czasem pomiędzy wywołaniami.

James King
źródło