← Știri

Cum aruncăm zarurile — și de ce sunt corecte

Sunt trucate zarurile la table online? Iată exact cum generează serverul nostru aruncările: criptografic, fără bias, cu aceleași șanse ca zarurile fizice.

technical 18 iunie 2026

Să începem cu întrebarea pe care orice jucător de table online a avut-o cel puțin o dată, de obicei imediat după ce a dat 6-1 când avea nevoie de orice altceva: sunt trucate zarurile?

E o suspiciune legitimă. Așa că, în loc să-ți spunem „ai încredere în noi”, o să-ți arătăm exact cum funcționează zarurile noastre — pe înțelesul tuturor, dar și cu codul real pentru scepticii care scriu software la job. Până la final vei ști despre zarurile noastre mai multe decât știi despre cele de lemn din sertar.

Zarurile se aruncă pe server, nu pe telefonul tău

Când apeși să arunci, dispozitivul tău nu decide nimic. Trimite o cerere către serverul nostru, serverul generează zarurile și trimite înapoi rezultatul. Rezultatul e fixat în clipa în care e creat.

La prima vedere asta pare mai puțin de încredere — „stai așa, voi aruncați zarurile?” — dar e exact invers. Dacă zarurile s-ar genera pe telefonul tău sau în browser, o aplicație modificată ar putea pur și simplu să arunce ce vrea ea. Duble la fiecare tură. Centralizând aruncările pe un server pe care îl controlăm și îl putem audita, niciun participant nu poate influența zarurile — nici tu, nici adversarul, nici noi în timpul jocului.

Aleatoriu predictibil vs. aleatoriu criptografic

Aici dau rateul, în liniște, majoritatea generatoarelor „aleatoare”.

Multe limbaje de programare vin cu o funcție aleatoare implicită, rapidă, dar predictibilă. Pornește de la un singur număr (un „seed”) și produce de acolo o secvență fixă. Oricine află seed-ul — sau pur și simplu urmărește suficiente aruncări — poate începe să prezică ce urmează. Pentru un joc competitiv, unde sunt în joc puncte și orgoliu, asta e inacceptabil.

Noi nu folosim așa ceva. Folosim crypto/rand din Go — aceeași clasă de aleatoriu folosită pentru a genera cheile de criptare care protejează traficul bancar. Provine din rezervorul de entropie al sistemului de operare, nu poate fi „însămânțat” și nu poate fi prezis din aruncările trecute. Nu există nicio secvență ascunsă de descifrat, pentru că nu există nicio secvență.

Câteva detalii pentru inginerii care citesc, valabile la Go 1.26 (limbajul pe care rulează backend-ul nostru):

  • Sursa de aleatoriu nu poate fi înlocuită pe ascuns cu una mai slabă. De la Go 1.26 se folosește mereu o sursă sigură, garantată de sistemul de operare; nimic din codul nostru sau din dependențe nu o poate degrada în tăcere.
  • Nu există revenire la valori ghicibile. Dacă sursa de entropie a sistemului ar ceda vreodată — practic imposibil — programul se oprește complet, în loc să continue cu aleatoriu prost. În cel mai rău caz jocul se oprește, niciodată nu trișează.

Capcana subtilă: bias-ul de modulo

Asta e partea de care aproape nimeni nu aude și de aici apar zarurile „aproape corecte”.

Calculatoarele produc aleatoriu sub formă de octeți — numere de la 0 la 255. Metoda naivă de a transforma asta într-o aruncare e să iei restul împărțirii la 6 („modulo 6”). Pare corectă. Nu e. Intervalul 0–255 nu se împarte egal în șase grupe, așa că unele fețe apar puțin mai des decât celelalte. E un bias minuscul, permanent și invizibil — dar pe milioane de aruncări devine real statistic. Asta e diferența dintre zaruri corecte și zaruri ușor măsluite.

Noi îl evităm complet. În loc de scurtătura cu restul, extragem un singur număr uniform din toate cele 36 de combinații posibile, cu crypto/rand.Int. În spate, asta folosește rejection sampling: aruncă discret valorile „rămase” care ar denatura rezultatul, așa că ce rămâne e matematic uniform. Fiecare dintre cele 36 de rezultate e exact la fel de probabil. Fără rest, fără bias.

Codul real

Nu-ți cerem să ne crezi pe cuvânt. Ăsta e mecanismul real (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}
}

Pentru cei curioși: big.NewInt(36) e spațiul complet de 6 × 6 rezultate, iar i/6 + 1 și i%6 + 1 despart acel singur număr înapoi în două fețe, de la 1 la 6.

Dublele funcționează exact ca la zarurile fizice

O aruncare înseamnă două zaruri. Când sunt egale — o dublă — tablele îți dau patru mutări cu acea valoare, așa că funcția returnează patru valori. Șansele sunt identice cu cele ale unei perechi reale de zaruri: orice dublă apare 1 din 6, iar o dublă anume (să zicem dublă de 5) e 1 din 36. Nu facem dublele mai rare ca să încetinim jocul, nici mai dese ca să-l grăbim. Cad exact atât de des pe cât spune fizica.

Ce nu face, intenționat, aruncarea

Aici e miezul suspiciunii de „trucat”, așa că să fim direcți. Funcția de zaruri:

  • nu citește scorul, starea meciului sau cine e pe cale să scoată pulele;
  • nu știe miza, cine ești tu sau cu cine joci;
  • nu are nicio logică de „revenire”, nicio curbă de dificultate, niciun ghiont în favoarea casei.

Singurul ei input e aleatoriul. Singurul ei output sunt două zaruri corecte. Zarurile chiar nu știu — și nu pot ști — că aveai nevoie de 6-1 și ai primit 2-1.

Încrederea se câștigă, nu se declară

Am fi putut scrie pur și simplu „zarurile noastre sunt corecte” și gata. Preferăm să-ți dăm mecanismul și codul și să te lăsăm să ne verifici. Ăsta e tot rostul articolului: transparența pe care o poți verifica bate liniștirea pe care trebuie s-o înghiți pe nemestecate.

Dacă ai jurat vreodată că zarurile sunt cu dinte pe tine, ești în companie bună — orice jucător de table a făcut-o. Diferența e că acum poți citi exact cum sunt făcute.

Joacă o partidă și convinge-te singur →

Preferi o aplicație? Descarc-o din App Store sau de pe Google Play.

Gata să joci?

Joacă acum
Joacă acum