He modificado ligeramente el programa para que también recuente las veces que hay un solo fallo o dos.
program bolas100;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
type
cien = array[0..99] of boolean;
const
CienFalsas:cien = (false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false,
false, false, false, false, false);
var
i, j, aciertos, ganadas, ganadas2,ganadas3,sacadas, bolas, bola,pronos,
extraídas, tandas, sorteos, anteriores,anteriores2,anteriores3 :integer;
Acertadas: cien;
begin
randomize;
ganadas:=0; ganadas2:=0;ganadas3:=0;
Write('Numero de bolas: '); readln(bolas);
Write('Números pronosticados: '); readln(pronos);
Write('Bolas extraídas: '); readln(extraídas);
Write('Tandas de sorteos: '); readln(tandas);
Write('Sorteos por tanda: '); readln (sorteos);
Ganadas := 0;
for i:= 1 to tandas do
begin
anteriores := ganadas; anteriores2:=ganadas2 ; anteriores3:=ganadas3;
for j:= 1 to sorteos do
begin
Acertadas:= CienFalsas;
Sacadas:=0;
Aciertos:=0;
While (aciertos < pronos) and (sacadas <= extraídas) do
begin
Bola:=random(bolas);
if (bola < pronos) and (not Acertadas[bola]) then
begin
Inc(Aciertos,1);
Acertadas[bola]:=true;
end;
Inc(sacadas,1)
end;
if aciertos = pronos then inc(ganadas,1);
if aciertos = pronos-1 then inc(ganadas2,1);
if aciertos = pronos-2 then inc(ganadas3,1);
end;
Writeln(ganadas - anteriores,' ', ganadas2 - anteriores2, ' ', ganadas3 - anteriores3);
end;
writeln('Ganadas: ',ganadas, ' Con un fallo: ',ganadas2,' Con dos fallos: ',ganadas3);
Writeln('Probabilidad de todo aciertos: ',ganadas/(tandas*sorteos));
Writeln('Probabilidad de todo menos uno: ',ganadas2/(tandas*sorteos));
Writeln('Probabilidad de todo menos dos: ',ganadas3/(tandas*sorteos));
readln;
end.
Y estos son los resultados:
Numero de bolas: 100
Números pronosticados: 15
Bolas extraídas: 60
Tandas de sorteos: 10
Sorteos por tanda: 100000000
293 6754 70150
290 6877 70265
322 6733 70141
295 6573 69491
281 6838 69782
305 6795 69911
311 6699 69916
269 6753 69592
280 6824 69400
269 6682 69901
Ganadas: 2915 Con un fallo: 67528 Con dos fallos: 698549
Probabilidad de todo aciertos: 2.91500000000000E-006
Probabilidad de todo menos uno: 6.75280000000000E-005
Probabilidad de todo menos dos: 6.98549000000000E-004
Puestos de forma natural son
P(15) = 0.000002915 una de cada 343053
P(14) = 0.000067528 una de cada 14809
P(13) = 0.000698549 una de cada 1432
Como puedes ver la probabilidad de 15 no es la misma que la que te dije la otra vez, cada vez puede tener ligeras variaciones.
En la otra pregunta te mando las probabilidades para 80 extracciones cuando el ordenador termine los cálculos.