C ++, 95 바이트
void f(){int d=-18,s=-1;while(s<9){d=(rand()%19+d+9)%10;cout<<d;s=9-rand()%10*min(d*d+s+1,1);}}
넓히는:
void f() {
int d=-18,s=-1;
while(s<9) {
d=(rand()%19+d+9)%10;
cout<<d;
s=9-rand()%10*min(d*d+s+1,1);
}
}
설명:
이 기능은 임의 값 스위치가 필요한 값을 가져와 기능을 중지 할 때까지 연속 임의의 숫자를 계속 인쇄합니다. d는 인쇄 할 다음 자릿수의 값을 유지하는 변수입니다. s는 간격 [0, 9]에서 임의의 정수 값을 취하는 스위치 변수입니다. s == 9이면 더 이상 숫자가 인쇄되지 않고 함수가 종료됩니다.
변수 d와 s는 첫 번째 숫자에 특별한 처리를하기 위해 초기화됩니다 ([-9, 9] 간격에서 시작하고 첫 번째 숫자가 0이면 함수는 선행 0을 피하기 위해 종료해야합니다). d의 값을 d = rand () % 10으로 지정할 수 있지만 첫 번째 숫자는 음수 일 수 없습니다. d는 대신 d = (rand () % 19 + d + 9) % 10으로 할당되고 -18에서 초기화되므로 d의 첫 번째 값의 범위는 [-9, 9]이며 다음 값의 범위는 항상 [0 , 9].
변수 s의 범위는 [0, 9]에서 무작위로되며, s가 9와 같으면 함수가 종료되므로 첫 번째 숫자를 인쇄 한 후 다음 숫자는 90 %의 확률로 인쇄됩니다 (rand ()가 실제로 임의라고 가정하고, 세 번째 조건을 충족시키기 위해). s를 s = rand () % 10으로 쉽게 지정할 수 있지만 예외는 있지만 첫 번째 숫자가 0이면 함수가 종료되어야합니다. 이러한 예외를 처리하기 위해 s는 s = 9-rand () % 10 * min (d * d + s + 1,1)로 지정되었고 -1로 초기화되었습니다. 첫 번째 숫자가 0이면 최소값은 0을 반환하고 s는 9-0 = 9와 같습니다. 변수의 할당 범위는 항상 [0, 9]의 범위이므로 첫 번째 숫자에서만 예외가 발생할 수 있습니다.
특징 (rand ()가 실제로 무작위라고 가정)
정수는 한 자릿수로 인쇄되며 마지막 숫자를 인쇄 한 후 다른 숫자를 인쇄 할 확률은 90 %입니다.
0은 인쇄 될 가능성이 가장 높은 정수이며, 대략 5.2 %의 확률입니다.
간격 [-10 ^ 6, 10 ^ 6]에서 정수를 인쇄 할 확률은 약 44 %입니다 (여기서는 계산되지 않음).
양의 정수와 음의 정수는 같은 확률로 인쇄됩니다 (~ 47.4 %).
모든 숫자가 같은 확률로 인쇄되는 것은 아닙니다. 예를 들어 정수를 인쇄하는 중에 마지막 숫자가 5 인 경우 숫자 3은 다음에 인쇄 될 가능성이 약간 낮아집니다. 일반적으로 마지막 숫자가 d 인 경우 숫자 (d + 18) % 10은 다음에 인쇄 될 가능성이 약간 낮아집니다.
출력 예 (10 회 실행)
-548856139437
7358950092214
507
912709491283845942316784
-68
-6
-87614261
0
-5139524
7
Process returned 0 (0x0) execution time : 0.928 s
Press any key to continue.