Posicionamento aleatório do inimigo em uma grade 2D

11

Quero colocar meus itens e inimigos aleatoriamente (ou o mais aleatoriamente possível). No momento, uso a Randomclasse do XNA para gerar um número entre 800 para X e 600 para Y. Parece que os inimigos aparecem mais no topo do mapa do que no meio ou no fundo. Eu não semeio o gerador, talvez isso seja algo a considerar.

Existem outras técnicas descritas que podem melhorar a colocação aleatória de inimigos em uma grade 2D?

Robb
fonte
Esta pergunta parece malformada. Você deseja colocar as coisas aleatoriamente, sem usar uma fonte de dados aleatórios? Isso é uma contradição. O que você está realmente tentando alcançar?
Andrew Russell
Gostaria de saber se existem outras técnicas além da classe Random do XNA para gerar um número entre um mínimo e um máximo. Vou tentar fazer uma pergunta mais clara
Robb
1
A classe Random da qual você está falando faz parte da estrutura .NET, não do XNA. Apenas fyi.
Michael Coleman
@ Omnion - eu estou ciente. Eu estava um pouco cansado ao criar a pergunta;)
Robb

Respostas:

16

O posicionamento aleatório não parece aleatório o suficiente para os olhos. Você provavelmente vai querer que os inimigos sejam espaçados um pouco mais uniformemente. Dê uma olhada neste artigo sobre amostragem de disco Poisson ou leia sobre ruído azul.

amitp
fonte
7

Shawn Hargreaves para o resgate!

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

Quando você pensa em distribuição aleatória, você realmente quer dizer distribuição uniforme. O Random da .Net está pensando aleatoriamente. Você precisa de outra coisa para equilibrar. O método de amostragem de disco de Poisson amitp vinculado parece perfeito para suas necessidades.

Cubed2D
fonte
+1 tirou as palavras da minha boca, a distribuição uniforme parece ser misturar com distribuição aleatória o tempo todo (eu mesmo cometi o mesmo erro)
Spooks
0

O código C # a seguir irá gerar um conjunto de pontos uniformes para você:

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
}

Observe que quando você usa o construtor Random () sem parâmetros, o objeto Random que você cria é propagado com base no tempo, portanto será essencialmente aleatório, a menos que você o faça repetidamente com muito pouco tempo entre as chamadas.

James King
fonte