Diyelim ki 20 taraflı bir paranız var. O ölüyü yuvarlamaya başlıyorsunuz ve sonunda 20 değerin hepsini yuvarlamadan önce birkaç düzine kez yuvarlamanız gerekiyor. Acaba, 20 değerin hepsini% 50 görme şansım olmadan önce kaç ruloya ihtiyacım var? Ve n
tüm n
tarafları yuvarlamadan önce kaç rulo taraflı kalıp almam gerekiyor ?
Biraz araştırma yaptıktan sonra, rulolardan sonra tüm değerleri yuvarlama şansını hesaplamak için bir formül bulunduğunu öğrenirsiniz.n
r
P(r, n) = n! * S(r, n) / n**r
burada S(a, b)
O anlamına gelir , ikinci türden numara Stirling yollarla k sayısı boş olmayan alt-(kenarda) içine n-nesneler (her bir rulo) bir dizi bölme.
Ayrıca , arayacağımız OEIS dizisini en az% 50 R(n)
olan en küçük r
yere karşılık geliyor P(r, n)
. Zor olan n
, bu sekansın terimini olabildiğince hızlı hesaplamaktır .
Meydan okuma
- A verildiğinde
n
, % 50'ye eşit veya daha büyük olan en küçükr
yeri bulun .P(r, n)
0.5
- Kodunuz teorik
n
olarak negatif olmayan herhangi bir tamsayıyı girdi olarak ele almalıdır , ancak kodunuzu yalnızca aralığında test edeceğiz1 <= n <= 1000000
. - Puanlama için,
R(n)
girdilerin1
üzerinden geçmek için gereken toplam süreyi alacağız10000
. - Çözümlerinizi bizim sürümü çalıştırarak doğru olup olmadığını kontrol edecektir
R(n)
görmek için çıkışına eğerP(your_output, n) >= 0.5
veP(your_output - 1, n) < 0.5
, yani çıktı aslında küçük olduğunur
, belirli bir içinn
. S(a, b)
Çözümünüz için herhangi bir tanım kullanabilirsiniz . Wikipedia'nın burada yardımcı olabilecek birkaç tanımı vardır.- Çözümlerinizi hesaplayanlar
S(a, b)
ve hattaP(r, n)
doğrudan hesaplayanlar da dahil olmak üzere yerleşik olarak kullanabilirsiniz . R(n)
Bunların hiçbiri zor sınırlar olmasa da 1000 değerine ve bir milyon Stirling sayısına kadar kod yazabilirsiniz ve bunları yükseltmek veya indirmek için ikna edici bir argüman yapabiliyorsanız değiştirilebilir.- Olası her kontrol etmek gerekmez
r
arasından
ver
aradığımız ama en küçük bulmak için gereğini yapmakr
ve sadece herhangi birr
yerdeP(r, n) >= 0.5
. - Programınız Windows 10'da serbestçe çalıştırılabilen bir dil kullanmalıdır.
Çözümlerinizi test edecek bilgisayarın özellikleri i7 4790k, 8 GB RAM
. @DJMcMayhem'e bilgisayarını test için sağladığı için teşekkürler . Referans için kendi resmi olmayan zamanlamanızı eklemekten çekinmeyin , ancak DJ test edebildikten sonra resmi zamanlama daha sonra sağlanacaktır.
Test senaryoları
n R(n)
1 1
2 2
3 5
4 7
5 10
6 13
20 67 # our 20-sided die
52 225 # how many cards from a huge uniformly random pile until we get a full deck
100 497
366 2294 # number of people for to get 366 distinct birthdays
1000 7274
2000 15934
5000 44418
10000 95768
100000 1187943
1000000 14182022
Herhangi bir sorunuz veya öneriniz varsa bize bildirin. İyi şanslar ve iyi optimizasyon!