161803398 'Özel' Bir Numara mı? Math.Random () içinde


162

Cevabın ' Matematik nedeniyle ' olduğundan şüpheleniyorum , ancak birisinin temel düzeyde biraz daha fazla fikir vermesini umuyordum ...

Bugün BCL kaynak kodunu inceliyordum, daha önce kullandığım sınıfların bazılarının gerçekte nasıl uygulandığına bir göz attım. Daha önce rastgele sayılar üretmeyi hiç düşünmemiştim, bu yüzden nasıl yapıldığını görmeye karar verdim.

Tam kaynak burada: http://referencesource.microsoft.com/#mscorlib/system/random.cs#29

private const int MSEED = 161803398; 

Bu MSEED değeri, bir Random () sınıfı her tohumlandığında kullanılır.

Her neyse, bu 'sihirli sayıyı' gördüm - 161803398 - ve bu sayının neden seçildiğine dair en sisli fikrim yok. Asal bir sayı ya da 2'nin gücü değil. Daha anlamlı görünen bir sayının 'yarısı' değildir. İkili ve onaltılı olarak baktım ve iyi, bana bir sayı gibi görünüyordu.

Google'da numarayı aramayı denedim, ancak hiçbir şey bulamadım.



6
@ 48klocs: Belgelerde böyle söylüyor :The current implementation of the Random class is based on Donald E. Knuth's subtractive random number generator algorithm. For more information, see D. E. Knuth. "The Art of Computer Programming, volume 2: Seminumerical Algorithms". Addison-Wesley, Reading, MA, second edition, 1981.
Jesse Good

4
@ 48klocs Evet, sayfa 283 burada: apps.nrbook.com/c/index.html Nedeni "çünkü matematik" gibi görünüyor.
eshs

22
@eshs: İlginç gerçek: bağlantınızın Sayfa 283 gösterir inextp = 31;, ancak Randomsınıfın kaynak kodu, inextp = 21;birisi bu hataya neden yanlış yazmış gibi var .
Jesse Good

7
@Izkata Kullanıcıları yalnızca kısa vadeli hedefi (belirli bir soruyu kapatmamak) amaçlamak için değil, site kalitesinin uzun vadeli hedefi için doğru davranış (yanlış kapanmak için oy vermemek) konusunda eğitmemiz gerekir. Ve yukarıdaki yorumları belirtmediysem, kopya olarak kapatılmış olabilir, çünkü insanlar bunu bazen yapar.
Bernhard Barker

Yanıtlar:


141

Hayır, ama Phi'ye ("altın oran") dayanır.

161803398 = 1.61803398 * 10^8  φ * 10^8

Burada altın oran hakkında daha fazla bilgi .

Ve burada sıradan matematikçi için gerçekten iyi bir okuma .

Ve bu iddiayı kabul eden rastgele sayı üreteçleri üzerine bir araştırma makalesi buldum . (Bkz. Sayfa 53.)


17
Phi'ye dayalı bir sayının neden tohum olarak iyi bir seçim yaptığını biliyor musunuz? Bunu burada özetlemek mümkün müdür?
Bernhard Barker

29
@Dukeling Sabit, gelen tohumu temperlemek için tam olarak bir kez kullanılır. Benim çok güçlü şüphem, birkaç bit seti (belki de ortak bir seçim) ile tohumların rastgele sayı üretecini (phi'nin büyülü bir özelliği yerine) vidalamasını önleyen kol numaramı yukarı hiçbir şey olarak seçilmemesidir .
David Eisenstat

7
Bahsedilen kitaptan bir fiyat teklifi vermek Knuth'a göre herhangi bir büyük MBIG ve daha küçük (fakat yine de büyük) MSEED yukarıdaki değerler yerine kullanılabilir. Matematiksel eğlence, az ya da çok .. Yani doğru cevap şöyle olmalı: Hayır. Ama Phi'ye dayanıyor.
TaW

14
Rastgele sayı kağıdına bir göz attım - bu çizgi biraz öne çıktı - "One can’t even fathom the repercussions if security flaws in the implementation (or design) of the SSL protocol are to be found."(sayfa 4)
jcw

2
Altın oranını kullanmanın daha alakalı bir yolunun, kod 10'daki taban 10 ile ilgisi olmayan bir basamağın 10 temsilini kullanmak yerine (modül / phi) kullanmak olacağını düşünürüm. Bu sayfada göremediğim kadarıyla, herhangi bir tam sayı N için, N / phi-int (N / phi)> = 1 / N / sqrt (5) değerinin olduğunu. Bu, biri N / phi-int (N / phi) sayıları dizisi oluştursa bile, en yakın çift arasındaki mesafenin aralıktaki olası en büyük tekdüze aralığın (5) sqrt (5) faktörü içinde olacağı anlamına gelir.
0..1

62

Bu sayı 1.61803398 * 10 ^ 8 altın oranından alınmıştır . Matt bu sayının ne olduğu hakkında güzel bir cevap verdi, bu yüzden bir algoritma hakkında biraz açıklayacağım.

Bu, bu algoritma için özel bir sayı değil. Algoritma, Knuth'un çıkarıcı rasgele sayı üreteci algoritmasıdır ve ana noktaları şunlardır:

  • 56 rasgele sayının dairesel bir listesini saklayın
  • başlatma, listenin doldurulması, ardından belirli bir deterministik algoritma ile bu değerlerin rastgele hale getirilmesi işlemidir.
  • 31 ayrı iki endeks tutulur
  • yeni rasgele sayı, iki endeksteki iki değerin farkıdır
  • yeni rastgele sayıyı listede sakla

Jeneratör aşağıdaki özyinelemeye dayanır: X n = (X n-55 - X n-24 ) mod m, burada n ≥ 0. Bu gecikmeli Fibonacci jeneratörünün kısmi bir halidir : X n = (X n-j @ X n-k ) mod m, burada 0 <k <j ve @ herhangi bir ikili işlemdir (çıkarma, toplama, xor).

Bu jeneratörün birkaç uygulaması vardır. Knuth kitabında FORTRAN'da bir uygulama sunuyor. Aşağıdaki yorum ile aşağıdaki kodu buldum :

PARAMETRE (MBIG = 1000000000, MSEED = 161803398, MZ = 0, FAC = 1.E-9)

Knuth'a göre, herhangi bir büyük MBIG ve daha küçük (ancak yine de büyük) MSEED yukarıdaki değerler ile ikame edilebilir.

Biraz daha burada bulunabilir Not, bunun aslında bir araştırma belgesi olmadığını (Math tarafından belirtildiği gibi), bu sadece bir yüksek lisans tezidir.

Kriptografideki insanlar irrasyonel sayıyı ( pi,, ) kullanmayı sever e, sqrt(5)çünkü bu tür sayıların basamaklarının eşit sıklıkta göründüğüne ve bu nedenle yüksek entropiye sahip olduğuna dair bir varsayım vardır . Bu numaralar hakkında daha fazla bilgi edinmek için güvenlik yığını değiş tokuşu ile ilgili bu soruyu bulabilirsiniz . İşte bir teklif:

"Sabitler rasgele seçilirse, yüksek olasılıkla hiçbir saldırgan onu kıramaz." Ancak paranoyak bir parti olan kriptograflar, "Bu sabitleri kullanalım. Onları rastgele seçtim, yemin ederim " dediğinde şüpheci . Yani bir uzlaşma olarak, say'nin ikili genişlemesi gibi sabitleri kullanacaklar. Artık onları büyük sayılar havuzundan rastgele seçmenin matematiksel yararına sahip olmamakla birlikte, en azından sabotaj olmadığından daha emin olabiliriz.


5
Cevaplayana gelince, sadece entropileri nedeniyle değil, aynı zamanda bu rakamlar kol numaramı hiçbir şey olarak ikiye katlamıyor .
Cole Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.