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 ile Sort yapmak 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.
  1. Vektörlerde dot product ve cross product oyunlarda ne için kullanılır?OrtaOyun MatematiğiGame Dev
  2. AABB ve sphere çarpışma testleri matematiksel olarak nasıl yapılır? Hangisi ne zaman tercih edilir?OrtaOyun MatematiğiGame Dev
  3. Transform matrisleri nedir? Local space ile world space arasında nasıl dönüşüm yapılır?OrtaOyun MatematiğiGame Dev
  4. Quaternion ile Euler açıları arasındaki fark nedir? Gimbal lock nedir?ZorOyun MatematiğiGame Dev
  5. Lerp ve Slerp nedir? Lerp'ü Update içinde yanlış kullanmak neden sorun yaratır?OrtaOyun MatematiğiGame Dev
  6. Vektör normalize etmek ne demektir? Çapraz harekette neden gereklidir?KolayOyun MatematiğiGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle