Calculo de probabilidades
Elijo 14 números distintos del oo al 99 ( total 100)luego de una esfera con los 100 números dentro se extraen 20 números distintos, de otra esfera otros 20 y de otra otros 20, ( total 60 ), ojo : ( de una esfera a la otra si se pueden repetir) que probabilidad tengo de acertar los 14, 13 y 12 números
1 respuesta
Siempre que se puedan repetir números igual dos que tres o todas las veces que se quiera los cálculos a mano o cálculos exactos con ordenador se hacen imposibles o muy complicados. Luego habrá que recurrir a la simulación. Hace muchos días que no hacías una pregunta de estas, voy a tener que buscar el programa, creo que debía llamarse BomboMúltiple o algo similar. Pero ahora estoy con una operación critica en el ordenador, cuando la acabe pongo a funcionar el programa para que esté calculando los 1.000.000.000 típicos de sorteos lo que le llevará sobre una hora ya que se extraen muchas bolas. Pero aun tardaré algo en prepararlo todo.
Como sabes han cambiado la página de arriba abajo. Y me parece que ahora no están muchas de las preguntas que me hiciste en tiempos. Podrías ver si tu las tienes todas y me dices en una pregunta similar a esta con varios bombos cuál era el nombre del programa que usaba. Es que tengo varios y no sé cual es que acabé uando al final que era el más pulido. Bueno, creo que será VariosBombos, tengo uno que se llama TresBombos pero es anterior. Ya terminé la descarga ahora mismo pongo el ordenador a calcular.
program VariosBombos;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
type
SalioNumero= array [0..99] of boolean;
CientounoNumeros= array [0..100] of integer;
const
CienNoes: SalioNumero = (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
NuBo, NuBombos, NuExtrac, Pronos, Tandas, SorTandas:integer;
i,j,k,l,n,Aciertos: integer;
BolasSalidasBombo, BolasSalidasTodosBombos: SalioNumero;
Buenos: CientounoNumeros;
Porcen: double;
begin
repeat
write('Numero de bolas, maximo 100: ');readln(NuBo);
until (Nubo>0) and (Nubo <= 100);
repeat
write('Numero de bombos, maximo 10: ');readln(NuBombos);
until (Nubombos >0) and (NuBombos <=10);
repeat
write('Numero de extracciones por bombo: ');readln(NuExtrac);
until (Nuextrac > 0) and (Nuextrac<=NuBo);
repeat
write('Numero de pronosticos: ');readln (Pronos);
until (pronos>0) and (pronos <= Nubo);
repeat
write('Numero de tandas de sorteos: ');readln(Tandas);
until Tandas >0;
repeat
write('Numero de sorteos por tanda: ');readln(SorTandas);
until SorTandas >0;
for i:=0 to 100 do Buenos[i]:=0;
for i:=1 to Tandas do
begin
for j:=1 to SorTandas do
begin
Aciertos:=0;
BolasSalidasTodosBombos:=CienNoes;
for k:=1 to Nubombos do
begin
BolasSalidasBombo:= CienNoes;
for l:=1 to NuExtrac do
begin
repeat
n:= random(NuBo);
until not BolasSalidasBombo[n];
BolasSalidasBombo[n]:= true;
if (not BolasSalidasTodosBombos[n]) and (n < Pronos) then
inc(Aciertos,1);
BolasSalidasTodosBombos[n]:=true;
end;
end;
inc(Buenos[Aciertos],1);
end;
writeln('Tanda ',i);
for j:= Pronos downto 0 do
begin
Porcen:= 100*Buenos[j]/(SorTandas*i);
writeln(j:3,Buenos[j]:12,Porcen:12:7,' %');
end;
end;
readln;
end.
¡Ay! Qué pena que la página se coma las indentaciones, algún día conseguiré que me hagan caso, aunque me parece que está muy crudo.
Pues ahora a esperar
No solo se comen los espacios y tabuladores, también las líneas en blanco. En fin, que el copiar y pegar se podria llamar copiar y despeinar.
Ya se han hecho los 100.000.000 primeros, el 10% ha habido
14 1896 0.001896%
13 34638 0.034638 %
12 288160 0.288160 %
Es interesante anotarlo para ver cuánta diferencia habrá con el resultado final. Ya salió también la segunda tanda, pero no anoto más hasta que salgan los resultados finales.
Y estos son los resultados finales, tardó mucho menos de lo que pensaba
14 18625 0.0018625 % 13 346303 0.0346303 % 12 2884311 0.2884311 % 11 14282835 1.4282835 % 10 46879777 4.6879777 % 9 108004606 10.8004606 % 8 180142417 18.0142417 % 7 221018840 22.1018840 % 6 200446863 20.0446863 % 5 133759226 13.3759226 % 4 64633521 6.4633521 % 3 21940454 2.1940454 % 2 4939717 0.4939717 % 1 662786 0.0662786 % 0 39719 0.0039719 %
¡Ah mira! En los bloques de texto si respeta los espacios, aprovecho para pegar de forma adecuada el programa
program VariosBombos; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; type SalioNumero= array [0..99] of boolean; CientounoNumeros= array [0..100] of integer; const CienNoes: SalioNumero = (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 NuBo, NuBombos, NuExtrac, Pronos, Tandas, SorTandas:integer; i,j,k,l,n,Aciertos: integer; BolasSalidasBombo, BolasSalidasTodosBombos: SalioNumero; Buenos: CientounoNumeros; Porcen: double; begin repeat write('Numero de bolas, maximo 100: ');readln(NuBo); until (Nubo>0) and (Nubo <= 100); repeat write('Numero de bombos, maximo 10: ');readln(NuBombos); until (Nubombos >0) and (NuBombos <=10); repeat write('Numero de extracciones por bombo: ');readln(NuExtrac); until (Nuextrac > 0) and (Nuextrac<=NuBo); repeat write('Numero de pronosticos: ');readln (Pronos); until (pronos>0) and (pronos <= Nubo); repeat write('Numero de tandas de sorteos: ');readln(Tandas); until Tandas >0; repeat write('Numero de sorteos por tanda: ');readln(SorTandas); until SorTandas >0; for i:=0 to 100 do Buenos[i]:=0; for i:=1 to Tandas do begin for j:=1 to SorTandas do begin Aciertos:=0; BolasSalidasTodosBombos:=CienNoes; for k:=1 to Nubombos do begin BolasSalidasBombo:= CienNoes; for l:=1 to NuExtrac do begin repeat n:= random(NuBo); until not BolasSalidasBombo[n]; BolasSalidasBombo[n]:= true; if (not BolasSalidasTodosBombos[n]) and (n < Pronos) then inc(Aciertos,1); BolasSalidasTodosBombos[n]:=true; end; end; inc(Buenos[Aciertos],1); end; writeln('Tanda ',i); for j:= Pronos downto 0 do begin Porcen:= 100*Buenos[j]/(SorTandas*i); writeln(j:3,Buenos[j]:12,Porcen:12:7,' %'); end; end; readln; end.
Y por si has venido directamente al final vulevo a poner los resultados
14 18625 0.0018625 % 13 346303 0.0346303 % 12 2884311 0.2884311 % 11 14282835 1.4282835 % 10 46879777 4.6879777 % 9 108004606 10.8004606 % 8 180142417 18.0142417 % 7 221018840 22.1018840 % 6 200446863 20.0446863 % 5 133759226 13.3759226 % 4 64633521 6.4633521 % 3 21940454 2.1940454 % 2 4939717 0.4939717 % 1 662786 0.0662786 % 0 39719 0.0039719 %
Y eso es todo.
No, no es eso.
Cuando decimos que la probabilidad es 1 de X estamos diciendo que la probabilidad es 1/X
Y cuando decimos que la probabilidad es Y estamos diciendo que es 1 de cada 1/Y
Es decir, el numero que representa la probabilidad y el número que va tras la expresión 1 de cada, son números inversos, dado uno de ellos el otro se calcula dividiendo 1 entre el primero.
Entonces si la probabilidad es 0.000018 para decirlo del otro modo tienes que dividir
1 / 0.000018 = 55555.555...
Y así dirás 1 de cada 55555, o mejor, 1 de cada 55556
Y eso es todo.
- Compartir respuesta