← Haberler

Zarları nasıl atıyoruz — ve neden bu adil

Online tavla zarları hileli mi? Sunucumuzun her atışı tam olarak nasıl ürettiğini görün: kriptografik, biassız, gerçek zarlarla aynı olasılıklarla.

technical 18 Haziran 2026

Her online tavla oyuncusunun en az bir kez aklından geçen soruyla başlayalım — genellikle başka her şeye ihtiyacı varken 6-1 attığı anın hemen ardından: zarlar hileli mi?

Şüphelenmek hakkınız. O yüzden size “bize güvenin” demek yerine, zarlarımızın tam olarak nasıl çalıştığını göstereceğiz — herkesin anlayacağı sade bir dille ve mesleği yazılım yazmak olan şüpheciler için gerçek kodla. Yazının sonunda zarlarımız hakkında, çekmecenizdeki tahta zarlardan daha çoğunu bileceksiniz.

Zarlar telefonunuzda değil, sunucuda atılıyor

Atmak için dokunduğunuzda cihazınız hiçbir şeye karar vermez. Sunucumuza bir istek gönderir, sunucu zarları üretir ve sonucu geri yollar. Sonuç, üretildiği anda kesinleşir.

İlk bakışta bu daha az güvenilir gibi gelir — “dur, zarları siz mi atıyorsunuz?” — ama tam tersi. Zarlar telefonunuzda ya da tarayıcıda üretilseydi, kurcalanmış bir uygulama dilediğini atabilirdi. Her turda çift. Atışları kontrol edebildiğimiz ve denetleyebildiğimiz bir sunucuda toplayarak, hiçbir tarafın zara yüklenmesini engelliyoruz — ne sizin, ne rakibinizin, ne de oyunun ortasında bizim.

Tahmin edilebilir rastgelelik mi, kriptografik rastgelelik mi

“Rastgele” üreteçlerin çoğu işte tam burada sessizce yanlışa düşer.

Birçok programlama dili, hızlı ama tahmin edilebilir bir varsayılan rastgele fonksiyonla gelir. Tek bir sayıdan (bir “tohum”dan) başlar ve oradan sabit bir dizi üretir. Tohumu öğrenen — ya da sadece yeterince atışı izleyen — biri, sıradakini tahmin etmeye başlayabilir. Puanların ve gururun söz konusu olduğu rekabetçi bir oyun için bu kabul edilemez.

Biz bu tür bir üreteç kullanmıyoruz. Go’nun crypto/rand’ını kullanıyoruz — banka trafiğini koruyan şifreleme anahtarlarını üretmek için kullanılan aynı sınıf rastgelelik. İşletim sisteminin entropi havuzundan çekilir, tohumlanamaz ve geçmiş atışlardan tahmin edilemez. Tersine mühendislik yapılacak gizli bir dizi yoktur, çünkü dizi diye bir şey yoktur.

Okuyan mühendisler için birkaç ayrıntı, Go 1.26 itibarıyla geçerli (backend’imizin çalıştığı dil):

  • Rastgelelik kaynağı gizlice daha zayıf bir kaynakla değiştirilemez. Go 1.26’dan itibaren her zaman güvenli, işletim sistemi destekli bir kaynak kullanılır; ne kodumuzdaki ne de bağımlılıklarımızdaki hiçbir şey onu sessizce zayıflatamaz.
  • Tahmin edilebilir değerlere geri dönüş yoktur. Sistemin entropi kaynağı bir gün arızalanırsa — ki pratikte imkânsız — program kötü rastgelelikle devam etmek yerine tamamen çöker. En kötü ihtimalle oyun durur, asla hile yapmaz.

İnce tuzak: modulo bias’ı

Bu, neredeyse kimsenin duymadığı kısım ve “neredeyse adil” zarlar buradan gelir.

Bilgisayarlar rastgeleliği ham bayt olarak üretir — 0’dan 255’e sayılar. Bunu bir zar atışına çevirmenin saf yolu, 6’ya bölümünden kalanı almaktır (“modulo 6”). Doğru görünür. Değildir. 0–255 aralığı altı gruba eşit bölünmez, bu yüzden bazı yüzler diğerlerinden biraz daha sık gelir. Minik, kalıcı, görünmez bir bias — ama milyonlarca atışta istatistiksel olarak gerçek hale gelir. Adil zarlarla hafifçe hileli zarlar arasındaki fark budur.

Bunu tamamen önlüyoruz. Kalan kısayolu yerine, crypto/rand.Int ile mümkün olan 36 zar kombinasyonunun tamamı üzerinden tek bir tekdüze sayı çekiyoruz. Bunun altında rejection sampling (reddetme örneklemesi) yatar: sonucu çarpıtacak “artık” değerleri sessizce atar, böylece geriye kalan matematiksel olarak tekdüzedir. 36 sonucun her biri tam olarak eşit olasıdır. Kalan yok, bias yok.

Gerçek kod

Sözümüze inanmanızı istemiyoruz. İşte gerçek mekanizma (Go 1.26):

package dice

import (
	"crypto/rand"
	"math/big"
)

// cryptoRoll returns the dice for a single backgammon roll.
// Each of the 36 combinations is exactly equally likely, with no modulo bias.
// Doubles return four moves; a normal roll returns two.
func cryptoRoll() []int {
	// One unbiased draw over all 36 combinations [0, 36).
	// rand.Int uses crypto/rand (secure, OS-backed) and rejects the
	// leftover values internally, so every outcome is equally likely.
	// On Go 1.24+, rand.Int cannot return an error here, so discarding
	// it is safe: crypto/rand.Read never errors and crashes the process
	// irrecoverably on the (practically impossible) entropy failure.
	n, _ := rand.Int(rand.Reader, big.NewInt(36))
	i := int(n.Int64())
	d1, d2 := i/6+1, i%6+1
	if d1 == d2 {
		return []int{d1, d1, d1, d1} // doubles → 4 moves
	}
	return []int{d1, d2}
}

Meraklılar için: big.NewInt(36), 6 × 6 sonuçtan oluşan tüm uzaydır; i/6 + 1 ve i%6 + 1 ise o tek sayıyı 1 ile 6 arasında iki yüze geri böler.

Çiftler tıpkı gerçek zarlar gibi çalışır

Bir atış iki zardır. İkisi eşleştiğinde — bir çift — tavla size o değerden dört hamle verir, bu yüzden fonksiyon dört değer döndürür. Olasılıklar gerçek bir zar çiftiyle aynıdır: herhangi bir çift 6’da 1 gelir, belirli bir çift (diyelim çift 5) ise 36’da 1’dir. Oyunu yavaşlatmak için çiftleri nadir, hızlandırmak için sık yapmıyoruz. Fiziğin söylediği sıklıkta düşerler.

Atışın bilinçli olarak yapmadığı şeyler

“Hile” şüphesinin özü burada, o yüzden açık konuşalım. Zar fonksiyonu:

  • skoru, maç durumunu ya da kimin zarları toplamak üzere olduğunu okumaz;
  • bahsi, kim olduğunuzu ya da kiminle oynadığınızı bilmez;
  • hiçbir “telafi” mantığı, zorluk eğrisi ya da ev lehine dürtme içermez.

Tek girdisi rastgeleliktir. Tek çıktısı iki adil zardır. Zarlar gerçekten bilmez — ve bilemez — 6-1’e ihtiyacınız olduğunu ve bunun yerine 2-1 aldığınızı.

Güven iddia edilmez, kazanılır

Sadece “zarlarımız adildir” yazıp geçebilirdik. Bunun yerine mekanizmayı ve kodu size verip işimizi denetlemenizi tercih ediyoruz. Bu yazının bütün amacı bu: doğrulayabileceğiniz şeffaflık, yutmak zorunda kaldığınız bir teminatı yener.

Zarların size karşı olduğuna yemin ettiğiniz olduysa, iyi bir topluluktasınız — her tavla oyuncusu bunu yaşadı. Fark şu: artık nasıl yapıldıklarını tam olarak okuyabiliyorsunuz.

Bir oyun oyna ve kendin gör →

Uygulamayı mı tercih edersin? App Store ya da Google Play’den indir.

Oynamaya hazır mısın?

Şimdi Oyna
Şimdi Oyna