20면의 주사위가 있다고 가정 해 봅시다. 다이를 굴리기 시작하고 마지막으로 20 개의 값을 모두 굴리기 전에 수십 번 굴려야합니다. 20 개의 값을 모두 볼 확률이 50 %가되기 전에 얼마나 많은 롤이 필요한지 궁금합니다. 그리고 n
모든 n
면 을 굴리기 전에 몇 개의 양면 주사위를 굴려야 합니까?
일부 조사 후 롤 후 모든 값을 굴릴 가능성 을 계산하기위한 공식이 있음을 알게됩니다 .n
r
P(r, n) = n! * S(r, n) / n**r
여기서 두 번째 종류의 스털링 번호 , n 개의 객체 세트 (각 롤)를 비어 있지 않은 서브 세트 (각면)로 분할하는 방법의 수를 S(a, b)
나타냅니다 .
또한 우리가 부르는 OEIS 시퀀스 는 50 % 이상인 R(n)
가장 작은 r
위치에 해당합니다 P(r, n)
. 문제는 n
이 시퀀스의 용어를 가능한 빨리 계산하는 것 입니다.
도전
- 가 주어지면 50 % 이상인 가장 작은 곳을
n
찾으십시오 .r
P(r, n)
0.5
- 코드는 이론적으로 음이 아닌 정수
n
를 입력 으로 처리해야 하지만의 범위 내에서만 코드를 테스트합니다1 <= n <= 1000000
. - 점수를 매기
R(n)
려면를1
통해 입력 을 실행 하는 데 필요한 총 시간이 걸립니다10000
. - 솔루션은 우리의 버전을 실행하여 올 경우 우리는 확인합니다
R(n)
확인하기 위해 출력하는 경우P(your_output, n) >= 0.5
와P(your_output - 1, n) < 0.5
, 즉 당신의 출력은 실제로 작은 것을r
주어진에 대한n
. S(a, b)
솔루션에서 정의를 사용할 수 있습니다 . Wikipedia 에는 여기에 도움이 될만한 몇 가지 정의가 있습니다.- 계산하는 솔루션
S(a, b)
또는P(r, n)
직접 계산하는 솔루션을 포함하여 솔루션에 내장 기능을 사용할 수 있습니다 . - 최대 1000 개의 값
R(n)
과 백만 개의 스털링 숫자 를 하드 코딩 할 수 있지만이 중 어느 것도 하드 한계가 아니며 값을 올리거나 내릴 때 설득력있는 주장을 할 수 있으면 변경할 수 있습니다. - 당신 과 우리가 찾고 있는 것
r
사이에 가능한 모든 것을 점검 할 필요는 없지만, 어디에서가 아니라 가장 작은 것을 찾아야합니다 .n
r
r
r
P(r, n) >= 0.5
- 프로그램은 Windows 10에서 자유롭게 실행할 수있는 언어를 사용해야합니다.
솔루션을 테스트 할 컴퓨터의 사양은 다음과 같습니다 i7 4790k, 8 GB RAM
. 테스트를 위해 컴퓨터를 제공 한 @DJMcMayhem 에게 감사합니다 . 참조 용으로 비공식 타이밍을 자유롭게 추가 할 수 있지만 DJ가 테스트 할 수있게되면 공식 타이밍이 나중에 제공됩니다.
테스트 사례
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
질문이나 제안 사항이 있으면 알려주십시오. 행운과 좋은 최적화!