Penempatan musuh acak pada grid 2d

11

Saya ingin menempatkan barang dan musuh saya secara acak (atau se acak mungkin). Saat ini saya menggunakan Randomkelas XNA untuk menghasilkan angka antara 800 untuk X dan 600 untuk Y. Rasanya seperti musuh menelurkan lebih banyak ke arah atas peta daripada di tengah atau bawah. Saya tidak seed generator, mungkin itu sesuatu yang perlu dipertimbangkan.

Apakah ada teknik lain yang dijelaskan yang dapat meningkatkan penempatan musuh acak di grid 2d?

Robb
sumber
Pertanyaan ini sepertinya salah bentuk. Anda ingin menempatkan sesuatu secara acak, tanpa menggunakan sumber data acak? Itu adalah kontradiksi. Apa yang sebenarnya ingin Anda capai?
Andrew Russell
Saya ingin tahu apakah ada teknik selain mengandalkan kelas Acak XNA untuk menghasilkan angka antara min dan maks. Saya akan mencoba membuat pertanyaan yang lebih jelas
Robb
1
Kelas acak yang Anda bicarakan adalah bagian dari kerangka .NET, bukan XNA. Hanya fyi.
Michael Coleman
@Onnion - Saya sadar. Saya agak lelah ketika membuat pertanyaan;)
Robb

Jawaban:

16

Penempatan acak tidak terlihat cukup acak bagi mata. Anda mungkin ingin musuh ditempatkan sedikit lebih merata. Lihatlah artikel ini tentang pengambilan sampel disk Poisson, atau baca tentang noise biru.

amitp
sumber
7

Shawn Hargreaves menyelamatkan!

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

Ketika Anda memikirkan pembagian acak, yang Anda maksud adalah distribusi yang merata. .Net's Random sedang berpikir secara acak. Anda perlu sesuatu yang lain untuk meratakannya. Metode pengambilan sampel disk Poisson yang terhubung ke tampak sempurna untuk kebutuhan Anda.

Cubed2D
sumber
+1 mengeluarkan kata-kata keluar dari mulut saya, bahkan distribusi tampaknya bercampur dengan distribusi acak sepanjang waktu (saya sendiri telah melakukan kesalahan yang sama)
Spooks
0

Kode C # berikut akan menghasilkan satu set titik seragam untuk Anda:

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
}

Perhatikan bahwa ketika Anda menggunakan konstruktor Acak () tanpa parameter, objek Acak yang Anda buat diunggulkan berdasarkan waktu, jadi itu akan menjadi dasarnya acak kecuali Anda melakukannya berulang kali dengan waktu yang sangat sedikit di antara panggilan.

James King
sumber