Эта статья о повторных выпадениях элементов коллекций. Для примера, возьмём коллекцию блекджека. Чтобы собрать М0, надо 8 элементов, а для М10 - 120 элементов , если для перехода с М9 до М10 каждого элемента надо 5 штук. Но это идеальный вариант, без повторов элементов коллекции. В реальности же, часто бывает, что выпадения необходимого элемента приходится ждать весьма долго, при этом остальных элементов выпадает в переизбытке. Мне захотелось узнать, какое максимальное количество элементов нужно собрать, чтобы коллекция при этом не собралась, и можно было уже начинать ругать за это админов на форуме игры. Для этой цели я написал программу, использующую генератор случайных чисел. Программа использует следующие исходные данные:
- количество элементов в коллекции (не более 16);
- количество попыток для сбора коллекции (количество всех выпавших элементов);
- количество повторных расчётов.
Вот некоторые результаты работы программы. Такой "рандом" совсем не радует.
Для сбора М0 и М1
Исходные данные: в коллекции 8 элементов, 120 попыток для сбора, 10000 повторных расчётов
самый плохой вариант: 10 14 1 15 23 13 25 19
то же самое для коллекции из 10 элементов
самый плохой вариант: 13 13 1 14 8 18 16 12 12 13
самый хороший вариант: 15 1 16 10 14 11 16 15 12 10
то же самое для коллекции из 12 элементов
самые плохие варианты:
15 7 0 14 6 17 8 9 12 7 13 12
1 9 15 6 9 22 12 9 11 9 7 10
самые хорошие варианты:
9 11 12 8 0 10 8 14 9 15 14 9
1 11 6 11 11 11 14 14 5 10 14 12
то же самое для коллекции из 16 элементов
самые плохие варианты:
5 18 9 9 0 11 7 7 6 5 7 6 5 12 6 7
8 7 7 10 7 7 4 7 9 19 5 1 10 6 7 6
самые хорошие варианты:
8 6 10 11 9 6 6 9 8 7 10 9 0 7 7 7
9 5 5 1 8 10 7 5 10 9 10 7 8 9 9 8
Для сбора М10
в коллекции 12 элементов, 50000 повторных расчётов
самый плохой вариант: 34 54 36 27 26 33 14 35 37 42 28 34
Для сбора М11
в коллекции 8 элементов
55 45 33 19 36 46 31 35
54 43 39 45 19 55 38 37
49 19 41 54 40 40 49 48
в коллекции 16 элементов
44 32 46 55 30 42 56 46 40 19 41 55 51 47 61 55
39 19 42 57 50 47 60 55 43 34 46 52 31 42 57 46
Для сбора М12
в коллекции 8 элементов
51 63 49 47 55 59 52 24
50 52 24 65 50 51 60 48
в коллекции 16 элементов
48 54 49 67 44 52 43 66 45 47 24 35 54 64 57 51
52 66 55 51 49 52 52 65 47 52 45 66 44 44 24 36
Для сбора М13
в коллекции 8 элементов
53 57 78 60 56 29 59 78
75 58 54 29 58 76 53 57
52 29 59 78 51 56 77 58
59 77 53 56 76 57 53 29
в коллекции 16 элементов
49 50 49 68 54 60 29 51 61 72 69 49 50 63 58 68
62 73 63 56 53 63 57 69 51 55 50 71 57 52 29 39
51 63 59 67 49 50 48 68 54 60 29 52 59 72 70 49
57 52 29 41 63 73 63 54 52 63 56 69 51 56 50 71
72 57 70 47 29 61 57 60 60 54 47 61 45 69 61 54
54 60 58 69 51 55 49 72 55 53 29 41 63 72 62 57
45 68 60 53 73 57 69 43 29 61 59 60 60 55 47 61
Для сбора М14
в коллекции 8 элементов
55 34 58 84 54 64 78 73
77 72 54 34 59 84 55 65
83 62 57 34 62 83 56 63
70 62 74 59 66 58 34 77
63 78 56 60 90 66 53 34
в коллекции 12 элементов
67 77 71 66 59 68 77 62 34 54 70 75
74 74 60 76 75 34 48 73 59 73 78 56
56 60 79 50 34 86 78 63 65 72 69 68
88 61 61 75 69 66 34 77 72 54 56 67
в коллекции 16 элементов
66 84 64 72 58 60 67 66 72 61 34 59 88 63 77 59
88 63 77 59 66 84 64 72 60 59 67 64 72 61 34 60
Для сбора М15
в коллекции 8 элементов
99 75 63 39 73 93 68 70
66 39 72 94 66 73 89 81
в коллекции 9 элементов
90 76 83 39 64 76 84 71 67
39 84 56 73 83 74 84 77 80
в коллекции 12 элементов
68 79 77 70 75 93 76 84 73 39 66 80
79 73 39 73 74 69 92 75 85 67 68 86
63 71 63 89 87 39 78 74 86 77 77 76
в коллекции 16 элементов
84 76 70 74 79 81 64 79 71 73 67 63 67 80 63 39
68 81 61 39 83 75 71 75 79 81 65 79 71 72 66 64
Ниже приведён старый текст программы, написанной на турбо паскаль. Её совсем несложно доработать, чтобы можно было считать коллекции от М11 до М15. Мне улучшать неохота. Для тех, кто не в курсе, напоминаю, что я учился программировать самоучкой, потому прошу особо не критиковать.
program kollekcii_random;
uses crt;
var j,k,l,c,elem,sborki,m10,m11,m15,a,b,d,sum0,sum1,sum3,sum5,sum6: integer;
i, povt: word;
kollekcia : array[1..16] of integer;
best_koll_0 : array[1..16] of integer;
best_koll_1 : array[1..16] of integer;
begin
clrscr;
randomize;
write('how many items in your colletion (no more 16) ? '); readln(elem);
writeln('do you need to perform the calculation');
write('for M10 modification (15 pieces of each item) ? 1-yes, 2-no '); readln(m10);
write('how many attempts to build the collection in one cycle ? '); readln(sborki);
write('how many cycles ? ' ); readln(povt);
writeln;
a:=0;
b:=0;
d:=0;
sum1:=0;
sum3:=0;
sum5:=1000;
sum6:=1000;
for i:=1 to povt do begin
for j:=1 to 16 do kollekcia[j]:=0;
m11:=0;
m15:=0;
sum0:=0;
for j:=1 to sborki do begin
c:=random(elem)+1;
inc(kollekcia[c]);
if sum0<kollekcia[c] then sum0:=kollekcia[c];
end;
if (m11<elem) and (m10=1) then begin
for k:=1 to elem do if kollekcia[k]>14 then inc(m11); { elements >= 15 }
if m11<elem-1 then m11:=0;
for k:=1 to elem do if kollekcia[k]=14 then m15:=1; {but only one element = 14}
if (m11=elem-1) and (m15=1) then begin {work with M10 : elements >= 15, and one element = 14 }
for l:=1 to elem do begin
if kollekcia[l]>100 then write(kollekcia[l],' ')
else write(kollekcia[l],' ');
end;
writeln;
writeln (' Some of the elements found in 14 copy in the cycle # ',i);
writeln;
d:=1;
end;
end;
for k:=1 to elem do begin
if (kollekcia[k]=0) and (m10=2) then begin
if sum5>sum0 then begin {zdes' pravil'no - sum0 obnyljat'}
sum5:=sum0;
for l:=1 to elem do best_koll_0[l]:=kollekcia[l];
end;
if sum1<sum0 then begin
for l:=1 to elem do begin
if kollekcia[l]<10 then write(kollekcia[l],' ') else
if kollekcia[l]>100 then write(kollekcia[l],' ') else
write(kollekcia[l],' ');
end;
a:=1;
writeln (' Some elements are not found in the cycle # ',i);
writeln;
sum1:=sum0;
end;
end;
if (kollekcia[k]=1) and (m10=2) then begin
{ for l:=1 to elem do if sum2<kollekcia[l] then sum2:=kollekcia[l];}
for l:=1 to elem do if kollekcia[l]>0 then inc(m11); {all elements >= 1 }
if m11<elem then m11:=0;
if (sum3<sum0) and (m11=elem) then begin { <= all variants with 1 }
for l:=1 to elem do begin
if kollekcia[l]<10 then write(kollekcia[l],' ') else
if kollekcia[l]>100 then write(kollekcia[l],' ') else
write(kollekcia[l],' ');
end;
b:=1;
writeln (' Some of the elements found in single copy in the cycle # ',i);
writeln;
sum3:=sum0;
end;
if m11=elem then begin
if sum6>sum0 then begin
sum6:=sum0;
for l:=1 to elem do best_koll_1[l]:=kollekcia[l];
end;
end;
end;
end; {of for k:=1 to elem}
end; {of for i:=1 to povt}
if (a=0) and (m10=2) then writeln('increase or decrease attempts to build. there are no variants with 0 items');
if (b=0) and (m10=2) then writeln('increase or decrease attempts to build. there are no variants with 1 items');
if (d=0) and (m10=1) then writeln('increase or decrease attempts to build. there are no variants with 15 items');
if (m10=2) and (a=1) then begin
for l:=1 to elem do write(' ',best_koll_0[l],' ');
writeln(' the best variant with 0 ');
end;
if (m10=2) and (b=1) then begin
for l:=1 to elem do write(' ',best_koll_1[l],' ');
writeln(' the best variant with 1 ');
end;
writeln ('press any key to finish ');
repeat until keypressed;
end.
|