Bir çember içinde düzgün dağılmış rastgele nokta nasıl üretilir? Ağırlıklı rastgele seçim (loot tablosu) nasıl yazılır?
Cevap
Çember içinde düzgün nokta
Naif yöntem açı = rastgele(0, 2π), yarıçap = rastgele(0, R) noktaları merkeze yığar, çünkü dış halkaların alanı daha büyüktür (alan r² ile büyür). Doğrusu yarıçapın karekökünü almaktır:
Vector2 RandomInCircle(System.Random rng, float R)
{
double angle = rng.NextDouble() * 2 * Math.PI;
double r = R * Math.Sqrt(rng.NextDouble()); // sqrt düzgün dağılım sağlar
return new Vector2((float)(r * Math.Cos(angle)), (float)(r * Math.Sin(angle)));
}Alternatif: Rejection sampling, yani kare içinde rastgele nokta üretip çemberin dışındakileri atmak (ortalama yaklaşık %21 ret). Küre içi için yarıçapta küp kök kullanılır. Unity'de Random.insideUnitCircle hazırdır.
Ağırlıklı rastgele seçim
public T PickWeighted<T>(IList<(T item, float weight)> table, System.Random rng)
{
float total = 0f;
foreach (var e in table) total += e.weight;
float roll = (float)rng.NextDouble() * total;
foreach (var e in table)
{
if (roll < e.weight) return e.item;
roll -= e.weight;
}
return table[table.Count - 1].item; // float yuvarlama güvenliği
}Çok sık çağrılıyorsa kümülatif ağırlık dizisi + binary search (O(log n)) veya alias method (O(1)) kullanılır.
Oyun tasarımında rastgelelik
- Gerçek rastgelelik adil hissettirmez: %10 düşme şansı olan bir item 40 denemede hiç düşmeyebilir. Pity sistemi (her başarısızlıkta olasılığı artırma) veya shuffle bag (Tetris'in 7-bag sistemi gibi torbayı karıştırıp sırayla çekmek) kullanılır.
- Karıştırma için Fisher-Yates kullanılmalıdır (O(n));
OrderBy(x => Random)gereksiz yere O(n log n) ve allocation'lıdır, rastgele sonuç döndüren bir comparator ileSortyapmak ise taraflı sonuç verir. - Normal (Gauss) dağılım: Birkaç uniform değerin ortalaması veya Box-Muller ile; ör. mermi saçılmasında merkeze yakın isabet.
- Deterministik olması gereken sistemler (replay, multiplayer, prosedürel üretim) için ayrı ve seed'li RNG örnekleri kullanılır.
İlgili Oyun Matematiği soruları
- Vektörlerde dot product ve cross product oyunlarda ne için kullanılır?
- AABB ve sphere çarpışma testleri matematiksel olarak nasıl yapılır? Hangisi ne zaman tercih edilir?
- Transform matrisleri nedir? Local space ile world space arasında nasıl dönüşüm yapılır?
- Quaternion ile Euler açıları arasındaki fark nedir? Gimbal lock nedir?
- Lerp ve Slerp nedir? Lerp'ü Update içinde yanlış kullanmak neden sorun yaratır?
- Vektör normalize etmek ne demektir? Çapraz harekette neden gereklidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.