← Νέα

Πώς ρίχνουμε τα ζάρια — και γιατί είναι δίκαιο

Είναι στημένα τα ζάρια στο online τάβλι; Δείτε ακριβώς πώς ο server μας παράγει κάθε ζαριά: κρυπτογραφικά, χωρίς bias, με ίδιες πιθανότητες με τα φυσικά ζάρια.

technical 18 Ιουνίου 2026

Ας ξεκινήσουμε με την ερώτηση που κάθε παίκτης online τάβλι έχει σκεφτεί τουλάχιστον μία φορά, συνήθως αμέσως μετά από μια 6-1 ενώ χρειαζόταν οτιδήποτε άλλο: είναι στημένα τα ζάρια;

Είναι δίκαιο να είστε καχύποπτοι. Έτσι, αντί να σας πούμε «εμπιστευτείτε μας», θα σας δείξουμε ακριβώς πώς λειτουργούν τα ζάρια μας — με απλά λόγια για όλους, και με τον πραγματικό κώδικα για τους σκεπτικιστές που γράφουν λογισμικό επαγγελματικά. Στο τέλος θα ξέρετε για τα ζάρια μας περισσότερα απ’ όσα ξέρετε για τα ξύλινα στο συρτάρι σας.

Τα ζάρια ρίχνονται στον server, όχι στο κινητό σας

Όταν πατάτε για να ρίξετε, η συσκευή σας δεν αποφασίζει τίποτα. Στέλνει ένα αίτημα στον server μας, ο server παράγει τα ζάρια και επιστρέφει το αποτέλεσμα. Το αποτέλεσμα οριστικοποιείται τη στιγμή που δημιουργείται.

Στην αρχή αυτό ακούγεται λιγότερο αξιόπιστο — «μισό λεπτό, εσείς ρίχνετε τα ζάρια;» — αλλά είναι το αντίθετο. Αν τα ζάρια παράγονταν στο κινητό σας ή στον browser, μια παραποιημένη εφαρμογή θα μπορούσε απλώς να ρίχνει ό,τι ήθελε. Διπλές σε κάθε γύρο. Συγκεντρώνοντας τις ζαριές σε έναν server που ελέγχουμε και μπορούμε να επιθεωρήσουμε, κανένας συμμετέχων δεν μπορεί να επηρεάσει τα ζάρια — ούτε εσείς, ούτε ο αντίπαλος, ούτε εμείς στη μέση του παιχνιδιού.

Προβλέψιμη vs. κρυπτογραφική τυχαιότητα

Εδώ είναι που οι περισσότερες «τυχαίες» γεννήτριες αστοχούν σιωπηλά.

Πολλές γλώσσες προγραμματισμού έρχονται με μια προεπιλεγμένη συνάρτηση τυχαιότητας που είναι γρήγορη αλλά προβλέψιμη. Ξεκινά από έναν μόνο αριθμό (έναν «σπόρο» / seed) και παράγει από εκεί μια σταθερή ακολουθία. Όποιος μάθει τον σπόρο — ή απλώς παρακολουθήσει αρκετές ζαριές — μπορεί να αρχίσει να προβλέπει τι έρχεται. Για ένα ανταγωνιστικό παιχνίδι όπου παίζονται πόντοι και εγωισμός, αυτό είναι απαράδεκτο.

Δεν χρησιμοποιούμε τέτοια γεννήτρια. Χρησιμοποιούμε το crypto/rand της Go — την ίδια κατηγορία τυχαιότητας που χρησιμοποιείται για τη δημιουργία κλειδιών κρυπτογράφησης που προστατεύουν τραπεζική κίνηση. Αντλείται από τη δεξαμενή εντροπίας του λειτουργικού συστήματος, δεν μπορεί να «σπαρθεί» και δεν μπορεί να προβλεφθεί από προηγούμενες ζαριές. Δεν υπάρχει κρυφή ακολουθία για αντίστροφη μηχανική, γιατί δεν υπάρχει ακολουθία.

Μερικές λεπτομέρειες για τους μηχανικούς που διαβάζουν, ακριβείς από το Go 1.26 (τη γλώσσα στην οποία τρέχει το backend μας):

  • Η πηγή τυχαιότητας δεν μπορεί να αντικατασταθεί κρυφά από μια ασθενέστερη. Από το Go 1.26 χρησιμοποιείται πάντα μια ασφαλής πηγή με υποστήριξη του λειτουργικού· τίποτα στον κώδικά μας ή στις εξαρτήσεις μας δεν μπορεί να την υποβαθμίσει σιωπηλά.
  • Δεν υπάρχει υποχώρηση σε προβλέψιμες τιμές. Αν η πηγή εντροπίας του συστήματος αποτύχει ποτέ — πρακτικά αδύνατο — το πρόγραμμα καταρρέει εντελώς αντί να συνεχίσει με κακή τυχαιότητα. Στη χειρότερη περίπτωση το παιχνίδι σταματά, ποτέ δεν εξαπατά.

Η λεπτή παγίδα: το modulo bias

Αυτό είναι το μέρος που σχεδόν κανείς δεν ακούει, και από εδώ προκύπτουν τα «σχεδόν δίκαια» ζάρια.

Οι υπολογιστές παράγουν τυχαιότητα ως ακατέργαστα bytes — αριθμούς από 0 έως 255. Ο αφελής τρόπος να το μετατρέψεις σε ζαριά είναι να πάρεις το υπόλοιπο της διαίρεσης με το 6 («modulo 6»). Φαίνεται σωστό. Δεν είναι. Το εύρος 0–255 δεν διαιρείται ομοιόμορφα σε έξι ομάδες, οπότε μερικές όψεις εμφανίζονται ελαφρώς συχνότερα από τις άλλες. Ένα μικροσκοπικό, μόνιμο, αόρατο bias — που σε εκατομμύρια ζαριές γίνεται στατιστικά υπαρκτό. Αυτή είναι η διαφορά μεταξύ δίκαιων ζαριών και ελαφρώς πειραγμένων.

Το αποφεύγουμε εντελώς. Αντί για τη συντόμευση του υπολοίπου, τραβάμε έναν μόνο ομοιόμορφο αριθμό από όλους τους 36 δυνατούς συνδυασμούς ζαριών με το crypto/rand.Int. Από κάτω χρησιμοποιεί rejection sampling: απορρίπτει σιωπηλά τις «περισσευούμενες» τιμές που θα αλλοίωναν το αποτέλεσμα, ώστε ό,τι μένει να είναι μαθηματικά ομοιόμορφο. Καθένα από τα 36 αποτελέσματα είναι ακριβώς εξίσου πιθανό. Χωρίς υπόλοιπο, χωρίς bias.

Ο πραγματικός κώδικας

Δεν σας ζητάμε να μας πιστέψετε στα λόγια. Αυτός είναι ο πραγματικός μηχανισμός (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}
}

Για τους περίεργους: το big.NewInt(36) είναι ο πλήρης χώρος των 6 × 6 αποτελεσμάτων, και τα i/6 + 1 και i%6 + 1 χωρίζουν αυτόν τον έναν αριθμό πάλι σε δύο όψεις από το 1 ως το 6.

Οι διπλές λειτουργούν ακριβώς όπως τα φυσικά ζάρια

Μια ζαριά είναι δύο ζάρια. Όταν ταιριάζουν — μια διπλή — το τάβλι σας δίνει τέσσερις κινήσεις αυτής της αξίας, οπότε η συνάρτηση επιστρέφει τέσσερις τιμές. Οι πιθανότητες είναι ίδιες με ένα πραγματικό ζευγάρι ζάρια: οποιαδήποτε διπλή έρχεται 1 στις 6, και μια συγκεκριμένη διπλή (ας πούμε διπλή 5άρια) είναι 1 στις 36. Δεν κάνουμε τις διπλές πιο σπάνιες για να καθυστερήσουμε το παιχνίδι, ούτε πιο συχνές για να το επιταχύνουμε. Πέφτουν ακριβώς τόσο συχνά όσο λέει η φυσική.

Τι σκόπιμα δεν κάνει η ζαριά

Εδώ βρίσκεται ο πυρήνας της υποψίας για «στημένο», οπότε ας μιλήσουμε ξεκάθαρα. Η συνάρτηση των ζαριών:

  • δεν διαβάζει το σκορ, την κατάσταση του αγώνα ή ποιος μαζεύει πούλια·
  • δεν ξέρει το ποντάρισμα, ποιος είστε ή με ποιον παίζετε·
  • δεν έχει καμία λογική «επιστροφής», καμπύλη δυσκολίας ή σπρώξιμο υπέρ του «καζίνου».

Η μόνη της είσοδος είναι η τυχαιότητα. Η μόνη της έξοδος είναι δύο δίκαια ζάρια. Τα ζάρια πραγματικά δεν ξέρουν — και δεν μπορούν να ξέρουν — ότι χρειαζόσασταν μια 6-1 και πήρατε μια 2-1.

Η εμπιστοσύνη κερδίζεται, δεν δηλώνεται

Θα μπορούσαμε απλώς να γράψουμε «τα ζάρια μας είναι δίκαια» και να προχωρήσουμε. Προτιμάμε να σας δώσουμε τον μηχανισμό και τον κώδικα και να σας αφήσουμε να ελέγξετε τη δουλειά μας. Αυτό είναι όλο το νόημα αυτού του άρθρου: η διαφάνεια που μπορείτε να επαληθεύσετε νικά τη διαβεβαίωση που πρέπει να καταπιείτε.

Αν ορκιστήκατε ποτέ ότι τα ζάρια τα είχαν μαζί σας, είστε σε καλή παρέα — κάθε παίκτης τάβλι το έχει κάνει. Η διαφορά είναι ότι τώρα μπορείτε να διαβάσετε ακριβώς πώς φτιάχνονται.

Παίξε μια παρτίδα και δες το μόνος σου →

Προτιμάς εφαρμογή; Κατέβασέ την από το App Store ή το Google Play.

Έτοιμος να παίξεις;

Παίξε Τώρα
Παίξε Τώρα