Rastgele Sayı Üretici

İstediğiniz aralıkta, tekrarlı veya tekrarsız rastgele sayılar üretin — kriptografik rastgelelikle. Çekiliş için idealdir.

1.443 görüntülenme

Sayılar Gerçekte Nasıl Üretiliyor?

Her "rastgele" birbirine eşit değildir. Her tarayıcıda bulunan Math.random(), hızlı ama sözde-rastgele bir üreteçtir — perde arkasında deterministiktir ve prensipte, iç durumunu bilen biri için tahmin edilebilir olabilir; bu da onu gerçek riskin olduğu çekilişler gibi güvenlik açısından hassas hiçbir şey için uygun kılmaz. Bu araç bunun yerine, işletim sisteminin entropi kaynaklarından beslenen ve prensipte bile tahmin edilemeyen tarayıcının kriptografik olarak güvenli rastgele sayı üreteci crypto.getRandomValues()'ı kullanır.

Güvenli bir rastgele kaynağa sahip olmak sorunun yalnızca yarısını çözer. Rastgele bir değeri belirli bir aralığa (örneğin 1-100) naif biçimde eşlemek — rastgele % 100 alarak — ince ama gerçek bir modulo yanlılığı yaratır: çünkü üretecin ham çıktı aralığı genelde 100'ün tam katı değildir, bu yüzden bazı kalanlar diğerlerinden hafifçe daha olası hale gelir. Yanlılık küçüktür ama gerçektir ve birçok çekim boyunca birikir — güya adil bir çekilişte kesinlikle istemeyeceğiniz türden bir şey.

Çözüm reddetme örneklemesidir: her ham değeri modulo ile zorla aralığa sokmak yerine, üreteç hedef aralığın tam katı olmayan ham değerleri atar ve tam olarak sığan bir değer gelene kadar yeniden çeker. Bu, tam olarak adil (uniform) bir dağılımı garanti eder — aralıktaki her sayının olasılığı tam olarak eşittir — bedeli ise ara sıra bir veya iki ekstra çekim gerekmesidir; bu da söz konusu hızlarda fark edilmezdir.

Bir en küçük değer, bir en büyük değer ve kaç sayı istediğinizi seçin; aynı girişin iki kez kazanmaması gereken çekilişler, kuralar, örnekleme ve oyunlar için istediğiniz tekrarsız seçeneğini işaretleyin. Her şey cihazınızda çalışır — hiçbir sayı hiçbir yere iletilmez veya saklanmaz, sayfayı yenilemek tamamen yeni bir çekiliş üretir.

Somut bir örnek: 1-6 aralığında naif bir modulo ile zar simüle etmeye kalksanız ve üretecin ham aralığı örneğin 0-255 olsaydı (256 değer), 256 tam olarak 6'ya bölünmediği için 0, 1, 2, 3 kalanları (yani 1, 2, 3, 4 zar yüzleri) 43'er kez, 4 ve 5 kalanları (5 ve 6 yüzleri) ise yalnızca 42'şer kez çıkardı — küçük ama gerçek bir yanlılık. Reddetme örneklemesi, 252-255 arası "fazlalık" değerleri baştan atıp yeniden çekerek bu 4 kalanın da tam olarak eşit sıklıkta çıkmasını garanti eder.

Bilinmesi Gerekenler

  • Modulo yanlılığı birkaç çekimde görünmezdir ama binlerce çekim üzerinden istatistiksel olarak tespit edilebilir hale gelir — reddetme örneklemesi bunu yalnızca küçültmek yerine tamamen ortadan kaldırır.
  • crypto.getRandomValues()'ın "kriptografik olarak güvenli" olması, çıktısının önceki çıktıları görmüş biri tarafından bile tahmin edilemeyeceği anlamına gelir — Math.random()'ın açıkça sahip olmadığı ve hiçbir zaman sahip olmak üzere tasarlanmadığı bir özellik.
  • Aralık iki uçtan da dahildir: 1-10 çekimi hem 1 hem 10 üretebilir, yalnızca ikisi arasındaki değerleri değil.
  • Denetlenebilir bir çekiliş için katılımcıları 1'den N'ye numaralandırın, aralığı buna göre ayarlayın, tekrarsızı etkinleştirin ve sonucun ekran görüntüsünü alın; çünkü çekilişten sonra sunucu tarafında hiçbir şey saklanmaz.
  • Tekrarsız modda, her çekilen sayı havuzdan çıkarılır; bu sayede aynı katılımcı ya da aynı sayı ikinci kez seçilemez, ama olasılıklar her çekimden sonra kalan havuza göre yeniden hesaplanır.

Sıkça Sorulan Sorular

Sayılar gerçekten rastgele mi, yoksa sadece "yeterince rastgele" mi?

İşletim sisteminin kriptografik entropi kaynağından beslenen crypto.getRandomValues()'tan gelirler - çoğu sıradan rastgele-sayı betiğinin kullandığı basit Math.random()'ın aksine, sadece pratikte değil prensipte de tahmin edilemezler.

Modulo yanlılığı nedir ve bu araçta var mı?

Rastgele bir değeri rastgele % N ile naif biçimde bir aralığa eşlemek bazı sayıları hafifçe kayırır, çünkü üretecin ham aralığı genelde N'nin tam katı değildir. Bu araç bunu reddetme örneklemesiyle önler: aralık dışı ham değerler atılır ve adil bir sonuç garanti edilene kadar yeniden çekilir.

Reddetme örneklemesi sade bir dille nedir?

Her rastgele değeri modulo işlemiyle zorla aralığa sokmak yerine, yanlılık yaratacak değerler basitçe atılır ve yeni bir değer çekilir - aralığa tam ve eşit biçimde sığan bir değer gelene kadar bu tekrarlanır. Bedeli ara sıra ekstra bir çekimdir; kazancı ise gerçekten adil bir sonuçtur.

Çekiliş için kullanabilir miyim?

Evet. Katılımcıları 1'den N'ye numaralandırın, aralığı buna göre ayarlayın, tekrarsızı etkinleştirin ve istediğiniz kadar kazanan üretin. Çekilişten sonra hiçbir şey saklanmadığı için kayıt amacıyla ekran görüntüsü alın.

En küçük ve en büyük değer aralığa dahil mi?

Evet - aralık iki uçtan da dahildir. 1-10 çekimi, tıpkı şapkadan numaralı kağıt çekercesine, hem 1 hem 10 üretebilir.

Yorumlar

Henüz yorum yok — ilk yorumu siz yazın!

Benzer Araçlar