← Blog'a geri dön

Rastgele Sayı Üreticiniz Adil mi? Pratik Denetim Kontrol Listesi

Araçlar ve Adillik30 Mart 2026·7 dakika okuma
Random number generator fairness audit

Çekiliş yaptığınızda, takımları rastgele seçtiğinizde veya görevleri kurayla dağıttığınızda, adalet isteğe bağlı değildir; bütün mesele budur. Ancak "rastgele" otomatik olarak "adil" anlamına gelmez. Rastgele sayı üreteçlerindeki (RNG'ler) gizli önyargılar, nereye bakacağınızı bilmediğiniz sürece sonuçları görünmez şekillerde çarpıtabilir.

Bu makale, ister Random Number Generator kullanıyor olun, ister kendinizinkini oluşturuyor olun, herhangi bir RNG'yi adalet açısından denetlemek için pratik bir kontrol listesi sunar.

Kullanıcıya Yönelik Çekilişler için Adil Olmanın Anlamı

Adil bir RNG şu durumlarda sonuçlar üretir:

Bunlardan herhangi birinin eksik olması, sonuçlar rastgele "görünse" bile güveni zedeler.

Yaygın Önyargı Kaynakları

Kötü Tohumlar

A PRNG (sözde rastgele sayı üreteci) yalnızca tohumu kadar tahmin edilemez. Yaygın kötü tohumlar:

Her zaman bir şifreleme kaynağından tohumlama yapın: tarayıcılarda crypto.getRandomValues(), Linux'ta /dev/urandom veya Linux'ta crypto.randomBytes() Node.js.

Modülo Önyargı

Çok ince ve yaygın bir hata: rastgele bir sayıyı bir aralığa indirmek için modulo operatörünü kullanmak.

// BIASED — if RNG range is not multiple of 6,
// some outcomes have slightly higher probability
const roll = randomUint32() % 6;

// CORRECT — rejection sampling
function fairDiceRoll() {
  const max = Math.floor(0xFFFFFFFF / 6) * 6;
  let value;
  do {
    value = crypto.getRandomValues(new Uint32Array(1))[0];
  } while (value >= max);
  return value % 6;
}

6 taraflı bir kalıp için, 32 bitlik bir tamsayıya sahip modulo sapması yalnızca ~%0,00000009'dur. Ancak daha büyük aralıklar veya 8 bitlik değerler için anlamlı hale gelir.

Gizli Filtreler

Bazı çekiliş sistemleri belirli sonuçları sessizce hariç tutar (örneğin, "son kazananları" filtrelemek veya operatörün beğenmediği sonuçları yeniden kaydetmek). Temel RNG mükemmel olsa bile bu, adaleti ihlal eder. Çekilişten önce tüm filtreleme kurallarını belgeleyin ve açıklayın.

Operatörler için Denetim Kontrol Listesi

  1. Entropi kaynağı — RNG bir şifreleme kaynağından mı tohumlanıyor? (Math.random değil, zaman damgaları değil)
  2. Tekdüzelik testi — 10.000'den fazla örnek çalıştırın ve ki-kare testi uygulayın. p değeri > 0,05 olmalıdır
  3. Modulo bias — Kod, reddetme örneklemesi veya tarafsız bir eşleme yöntemi kullanıyor mu?
  4. Bağımsızlık — Sıralı çekilişler birbiriyle ilişkili mi? Büyük örnek kümelerinde bir otokorelasyon testi çalıştırın
  5. Kod incelemesi — Çizim kodu açık kaynak mı yoksa denetlenebilir mi? Gizli kod arka kapılar içerebilir
  6. Filtreleme açıklaması — Herhangi bir sonuç filtrelendi mi, yeniden kaydedildi mi veya hariç tutuldu mu? Bu açıklanmalıdır
  7. Timing — Operatör sonuçları yayınlamadan önce görebilir mi? Cevabınız evet ise, olumsuz çekilişleri seçerek iptal edebilirler

Kamuya Açık Çekilişler için Şeffaflık Modeli

Yüksek bahisli çekilişler (ödüller, ödevler, seçimler) için taahhüt-açıklama şeması:

kullanın
  1. Çekilişten önce: Rastgele bir tohum oluşturun. SHA-256 karmasını ("taahhüt") yayınlayın — örneğin, sosyal medyada veya zaman damgalı bir belgede
  2. Çekilişi çalıştırın: Belirleyici bir algoritmayla sonuçlar üretmek için çekirdeği kullanın
  3. Çekilişten sonra: Tohumu yayınlayın. Herkes şunu doğrulayabilir:
    • Tohum, yayınlanan karma değeri üretir
    • Token + algoritması duyurulan sonuçları üretir

Taahhüt karmasını oluşturmak ve doğrulamak için Karma Oluşturucumuzu kullanın.

// Taahhüt aşaması
const tohum = crypto.randomBytes(32).toString('hex');
const taahhüt = sha256(tohum); // bunu çekilişten önce yayınla // Çizim aşaması
const sonuç = deterministicDraw(tohum, katılımcılar); // Aşamayı göster
// tohum yayınla — herkes sha256(seed)'i doğrulayabilir === taahhüt

Kullanıcılara Adil Olmayı Anlatma

Güven şeffaflık gerektirir. Herkese açık çekilişler yapılırken:

FAQ

Math.random yeterince iyi mi?

Hayır. Math.random(), kriptografik olarak güvenli olmayan bir sözde rastgele sayı üreteci (PRNG) kullanır. Dahili durum biliniyorsa çıkışı tahmin edilebilir. Adil çekilişler için tarayıcıda crypto.getRandomValues() veya Node.js'de crypto.randomInt() kullanın.

Bir çekilişin manipüle edilmediğini nasıl kanıtlayabilirim?

Taahhüt-açıklama şeması kullanın: çekilişten önce rastgele tohumun (taahhüt) bir karmasını yayınlayın. Çekilişten sonra tohumu ortaya çıkarın. Herkes, tohumun yayınlanan karma değeri ve açıklanan sonuçları ürettiğini doğrulayabilir.

Temel önyargı kontrolleri için kaç örneğe ihtiyacım var?

N sonuç arasında basit bir tekdüzelik kontrolü için en az 100×N örneğe ihtiyacınız vardır (örneğin, 10 seçenekli bir çekiliş için 1.000 örnek). Ki-kare testi uygulayın: p değeri 0,05'in üzerindeyse dağılım makul derecede tekdüzedir. Ciddi denetimler için 10.000'den fazla örnek kullanın.

İlgili Araçlar ve Makaleler