Çekiliş nasıl çalışır — gerçek bir örnek
Uçtan uca gerçek biçimli bir çekilişi adım adım inceleyin: 1.000 uygun yorum, 3 kazanan, 9 yedek. Jargon yok, belirsizlik yok.
Senaryo
Yarışmanın sona erdiğini düşünün. Yorumlar alındı, yarışmanın filtreleri çalıştı ve 1.000 katılım uygun. Ödül 9 yedekle birlikte 3 kazanana verilecek; kazananlardan herhangi birine ulaşılamazsa yedekler devreye giriyor. İşte katılım başına olasılık — 1.000 uygun yorumun her biri için eşit, yorumun ne zaman gönderildiğine veya yorum sahibinin adının uzunluğuna bakılmaksızın.
| Sonuç | Herhangi bir katılım için şans |
|---|---|
| Ana kazanan olarak seçildi (1–3. sıralar) | 1.000'de 3 — %0,30 |
| Yedek olarak seçildi (4–12. sıralar) | 1.000'de 9 — %0,90 |
| Herhangi bir kazanan yerine seçildi | 1.000'de 12 — %1,20 |
Yarışmada 444 yorum veya 444.444 yorum olsa da bunların hiçbiri değişmez. Algoritma aynıdır. Yalnızca payda değişir.
Adım 1 — Katılımları topla ve filtrele
Uygulama, bağladığınız Facebook veya Instagram gönderisindeki her yorumu alır, ardından yarışmanın filtrelerini uygular — tekrarlar, engellenen kelimeler, hesap yaşı kuralları, yapılandırılan her şey. Geride kalan uygun küme olur. Senaryomuzda bu 1.000 yorumdur. Her birinin benzersiz bir sayısal kimliğe sahip bir veritabanı satırı vardır; bu 1.000 kimlik, çekilişin geri kalanının üzerinde çalıştığı şeydir.
Adım 2 — Kanonik bir sıraya göre sıralama
Rastgele bir şey olmadan önce uygulama, 1.000 kimliği artan sayısal sırayla kesin olarak sıralar — 17, 142, 203, 1058, 9941, … — ve geldikleri sırayı atar. Neden? Çünkü Facebook, sayfalama, günün saati veya arka uç değişikliklerine bağlı olarak yorumları farklı sıralarda döndürebilir. Çekiliş Facebook'un sırasını kullansaydı, aynı rastgele tohumla iki yeniden alma farklı kazananlar üretebilirdi. Önce sıralama, girişi tek bir kanonik listeye sabitler; böylece tohum tek başına sonucu belirler.
Adım 3 — Girdi listesini SHA-256 karmasıyla kilitle
Sıralı liste SHA-256'ya — kriptografik bir karma işlevine — beslenir ve 64 karakterlik bir parmak izi üretir. Yarışma kaydına parmak izinin yanı sıra listenin tamamı da kaydedilir. Bu andan itibaren, yarışmayı inceleyen herkes uygun listenin değiştirilmediğini doğrulayabilir: yayımlanan listeyi yeniden karma edin, kaydedilen parmak iziyle karşılaştırın; tek bir değiştirilen kimlik tamamen farklı bir karma verir. Bu adımdan sonra yorumu sessizce eklemenin veya kaldırmanın hiçbir yolu yoktur; herkes bunu görebilir.
Adım 4 — 256 bitlik rastgele tohum oluştur
Uygulama, işletim sisteminin kriptografik rastgele kaynağından (SecureRandom.hex(32)) 32 bayt öngörülemeyen rastgelelik ister ve sonucu 64 karakterlik onaltılık bir dize olarak saklar — örneğin a3f1…ce. 256 bit, 2²⁵⁶ ≈ 10⁷⁷ olası tohum demektir. Bakış açısı için, gözlemlenebilir evren yaklaşık 10⁸⁰ atom içerir. Hiç kimse — yarışma oluşturucusu, operatör veya dışarıdan izleyen bir saldırgan — bu tohumun oluşturulmadan önce ne olacağını tahmin edemez veya bilemez.
Adım 5 — 1.000 kimliği karıştır, ardından ilk 12'yi al
Tohum, belirleyici bir karıştırma motorunu başlatır ve ardından 1.000 sıralı kimlik üzerinde Fisher–Yates karıştırması gerçekleştirir. Fisher–Yates, standart adil karıştırma algoritmasıdır — 1.000 katılımın her birinin her konuma gelme şansı eşittir. Karıştırmanın ardından uygulama üstten ilk 12 girişi alır. Bu, seçim adımının tamamıdır: karıştır, 12'yi dilimlе.
Adım 6 — Konumları ata
Seçilen 12 giriş sırayla işlenir. İlk üçü 1., 2. ve 3. kazanan olur; sonraki dokuzu 1. ile 9. arasındaki yedekler olur. Kalan 988 uygun giriş seçilmedi olarak kaydedilir. Daha önce filtrelenen yorumlar, neden uygun olmadıklarının belirli nedeniyle diskalifiye edilmiş olarak işaretlenir.
Adım 7 — Her şeyi yayımla
Son olarak uygulama, yarışma kaydına beş kanıt parçası kaydeder — hepsi herkesçe okunabilir. Bunlar olmadan sonuç bir kara kutu olurdu. Bunlarla herkes çekilişin tamamını evde yeniden üretebilir ve yayımlanan kazananların tohumun üretebileceği tek kazananlar olduğunu doğrulayabilir.
Her çekilişle birlikte yayımlananlar
Bunların her biri yarışmada saklanır ve herkese açık doğrulama sayfaları üzerinden sunulur. Birlikte çekilişi tam olarak yeniden üretilebilir kılarlar — aynı girdiler, aynı çıktılar, her zaman.
- 256 bitlik rastgele tohum — 4. Adımdaki 64 karakterlik onaltılık dize.
- Sıralı uygun kimlik listesi — 2. Adımdaki kanonik sırayla tüm 1.000 kimlik.
- Kimlik listesinin SHA-256 parmak izi — 3. Adımdaki 64 karakterlik karma. Yayımlanan listenin değiştirilmediğini doğrular.
- Algoritma sürümü — şu an
v1. Tam seçim algoritmasını sabitler; böylece gelecekteki iyileştirmeler eski sonuçları geriye dönük olarak değiştirmez. - Ruby sürümü — karıştırmanın tam sıralaması buna bağlı olduğundan dil çalışma zamanını sabitler.
Matematiği kendiniz yeniden çalıştırın — beş satırda
Ruby yüklüyse (macOS ve çoğu Linux dağıtımıyla birlikte gelir), çekilişi evde tam olarak yeniden üretebilirsiniz. Her yarışma, doğrulama sayfasında kendi eligible-ids.txt dosyasını yayımlar (URL deseni: /results/<token>/verify) — doğrulama rehberi adım adım indirme sürecini anlatır. Yayımlanan tohumun kopyasını alın ve bunu irb'ye yapıştırın:
require "digest"
seed = "PASTE_THE_PUBLISHED_SEED_HERE"
ids = File.read("eligible-ids.txt").split("\n").map(&:to_i).sort
# (1) Sanity check the input: must equal the published SHA-256.
Digest::SHA256.hexdigest(ids.join("\n"))
# (2) Re-run the shuffle. First 3 items are winners 1..3 (in order);
# the next 9 items are reserves 1..9.
ids.shuffle(random: Random.new(seed.to_i(16))).first(12)
12 kimlik, yarışmanın yayımladığıyla tamamen aynı sırada çıkar. Üç kazanan, dokuz yedek, bit bit özdeş. Pick a Winner çekilişini yalnızca söz verilen değil doğrulanabilir kılan da budur — matematiği operatörün sözü değil, algoritma yapar.
Neden hile yapmak zordur
- Tohum tahmin edilemez. 2²⁵⁶ olasılık, yalnızca uygun liste taahhüt edildikten sonra oluşturulur. Hiç kimse tohumun hangi kimlikleri favori yapacağını önceden hesaplayamaz; çünkü tohum çekiliş anına kadar mevcut değildir.
- Girdi kilitlidir. SHA-256 parmak izi, tohumun göründükten sonra bir arkadaşın yorumunu sessizce eklemenizi engeller — parmak izi değişir ve çekiliş artık yeniden üretilemez.
- Karıştırma mekaniktir. Tohum ve sıralı liste bir kez mevcut olduğunda kazananlar belirlenmiş olur. Aralarında hiçbir insan kararı yoktur. Sonradan yapılan herhangi bir değişiklik, biri matematiği yeniden çalıştırdığı anda uyumsuzluk olarak ortaya çıkar.
- Makbuz herkese açıktır. Tohum, liste, karma, algoritma sürümü, Ruby sürümü — beşi de yayımlanmıştır. Çekilişin operatörün herkesin görebileceği şekilde değiştirebileceği özel bir parçası yoktur.