El algoritmo del que hablo me permitiría presentarlo con x número de elementos, cada uno de los cuales tiene un rango de aab con el resultado de y. Me gustaría tener un algoritmo que, cuando se presenta con los valores como se describe, genere la posibilidad de que ocurra.Algoritmo para calcular la probabilidad de que suceda una suma de los resultados
Por ejemplo, para dos mueren. Ya los conozco (debido a que los resultados posibles son muy bajos). Sería capaz de decirle cada una de las posibilidades.
La configuración sería algo así como. x = 2 a = 1 b = 6. Si quisieras saber la posibilidad de que resulte en un 2. Entonces simplemente escupiría 1/36 (o su valor flotante). Si coloca 7 como la suma total, le diría 6.
Así que mi pregunta es, ¿existe una manera simple de implementar tal cosa mediante un algoritmo que ya está escrito? O bien, uno tiene que pasar por cada iteración de cada elemento para obtener el número total de combinaciones para cada valor.
La fórmula exacta también, le daría las combinaciones para hacer cada uno de los valores del 1-12.
Así que le daría una matriz de distribución con las combinaciones de cada uno en cada uno de los índices. Si lo hace 0-12. Entonces 0 tendría 0, 1 tendría 0 y 2 tendrían 1.
Siento que este es el tipo de problema que alguien más ha tenido y con el que quería trabajar y que ya lo ha hecho. Si alguien tiene una manera fácil de hacer esto más allá de simplemente pasar por todos los valores posibles, sería increíble.
No tengo idea de por qué quiero resolver este problema, pero por alguna razón hoy tuve la sensación de querer resolverlo. Y como he estado buscando en Google y usando wolfram alpha, además de probarlo yo mismo. Creo que es hora de reconocer la derrota y preguntar a la comunidad.
Me gustaría que el algoritmo esté en c, o tal vez PHP (aunque preferiría que no lo fuera, ya que es mucho más lento). La razón de c es simplemente porque quiero velocidad sin formato, y no quiero tener que lidiar con clases u objetos.
Pseudocódigo, o C es la mejor manera de mostrar su algoritmo.
Editar:
Además, si ofendí a la persona con una 'B' en su nombre debido a lo que pasa con las matemáticas lo siento. Como no quise ofender, solo quería decir que I no lo entendí. Pero la respuesta podría haber permanecido allí ya que estoy seguro de que hay personas que podrían llegar a esta pregunta y comprender las matemáticas que hay detrás.
Además, no puedo decidir por qué camino quiero codificar esto. Creo que intentaré usar ambos y luego decidiré cuál me gusta más para ver/usar dentro de mi pequeña biblioteca.
Lo último que olvidé decir es que el cálculo está a punto de ocurrir hace cuatro años. Mi comprensión de la probabilidad, las estadísticas y la aleatoriedad provienen de mi propio aprendizaje al mirar el código/lectura de wikipedia/lectura de libros.
Si alguien tiene curiosidad, es lo que provocó esta pregunta. Tenía un libro que posponía leer llamado The Drunkards Walk y luego, una vez que dije XKCD 904, decidí que era hora de finalmente leerlo. Entonces, hace dos noches, mientras iba a dormir ...Había reflexionado sobre cómo resolver esta pregunta a través de un algoritmo simple y pude pensar en uno.
Mi comprensión del código de codificación proviene de jugar con otros programas, ver lo que sucedió cuando rompí algo, y luego probar mis cosas mientras reviso la documentación para las funciones de compilación. Entiendo la notación de O grande al leer sobre wikipedia (tanto como uno puede por eso), y el pseudo código era porque es muy similar a python. Yo mismo, no puedo escribir pseudo código (o dice que los profesores en la universidad). Seguí recibiendo notas como "haz que sea menos como el código real lo hagas más como un seudo código". Esa cosa no ha cambiado.
Editar 2: En caso de que alguien que busque esta pregunta simplemente quería el código rápidamente. Lo he incluido a continuación. Está licenciado bajo LGPLv3 ya que estoy seguro de que existen equivalentes de código cerrado de este código.
Debe ser bastante portátil ya que está escrito completamente en c. Si uno quisiera convertirlo en una extensión en cualquiera de los varios idiomas que están escritos en c, debería tomar muy poco esfuerzo hacerlo. Elegí 'marcar' el primero que se vinculó con "Ask Dr. Math" como la respuesta ya que fue la implementación que he usado para esta pregunta.
El primer nombre de archivo es "sum_probability.c"
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
/*!
* file_name: sum_probability.c
*
* Set of functions to calculate the probabilty of n number of items adding up to s
* with sides x. The question that this program relates to can be found at the url of
* http://stackoverflow.com/questions/6394120/
*
* Copyright 2011, Macarthur Inbody
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Lesser GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the Lesser GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*
* 2011-06-20 06:03:57 PM -0400
*
* These functions work by any input that is provided. For a function demonstrating it.
* Please look at the second source file at the post of the question on stack overflow.
* It also includes an answer for implenting it using recursion if that is your favored
* way of doing it. I personally do not feel comfortable working with recursion so that is
* why I went with the implementation that I have included.
*
*/
/*
* The following functions implement falling factorials so that we can
* do binomial coefficients more quickly.
* Via the following formula.
*
* K
* PROD (n-(k-i))/i
* i=1;
*
*/
//unsigned int return
unsigned int m_product_c(int k, int n){
int i=1;
float result=1;
for(i=1;i<=k;++i){
result=((n-(k-i))/i)*result;
}
return result;
}
//float return
float m_product_cf(float n, float k){
int i=1;
float result=1;
for(i=1;i<=k;++i){
result=((n-(k-i))/i)*result;
}
return result;
}
/*
* The following functions calculates the probability of n items with x sides
* that add up to a value of s. The formula for this is included below.
*
* The formula comes from. http://mathforum.org/library/drmath/view/52207.html
*
*s=sum
*n=number of items
*x=sides
*(s-n)/x
* SUM (-1)^k * C(n,k) * C(s-x*k-1,n-1)
* k=0
*
*/
float chance_calc_single(float min, float max, float amount, float desired_result){
float range=(max-min)+1;
float series=ceil((desired_result-amount)/range);
float i;
--amount;
float chances=0.0;
for(i=0;i<=series;++i){
chances=pow((-1),i)*m_product_cf(amount,i)*m_product_cf(desired_result-(range*i)-1,amount)+chances;
}
return chances;
}
Y aquí es el archivo que muestra la aplicación como dije en el archivo anterior.
#include "sum_probability.c"
/*
*
* file_name:test.c
*
* Function showing off the algorithms working. User provides input via a cli
* And it will give you the final result.
*
*/
int main(void){
int amount,min,max,desired_results;
printf("%s","Please enter the amount of items.\n");
scanf("%i",&amount);
printf("%s","Please enter the minimum value allowed.\n");
scanf("%i",&min);
printf("%s","Please enter the maximum value allowed.\n");
scanf("%i",&max);
printf("%s","Please enter the value you wish to have them add up to. \n");
scanf("%i",&desired_results);
printf("The total chances for %i is %f.\n", desired_results, chance_calc_single(min, max, amount, desired_results));
}
¿es una tarea? – zengr
absolutamente no. Me levanté hoy y tuve esta pregunta en mi cabeza. Pero quería hacerlo eficiente. Fue como el otro día, cuando reescribí completamente el prng dentro de PHP, de modo que utilizó mejores fuentes de entropía y generó números que están distribuidos de manera más uniforme. ¿Nunca has tenido ganas de encontrar de alguna manera una respuesta? Por favor, dime que no has llegado al punto en el que ya no buscas nuevos conocimientos al azar. – 133794m3r
jaja, podrías haber dicho un no. Es solo que algunos estudiantes intentan encontrar un atajo. Mi mal :) – zengr