Алгоритм для вычисления вероятности возникновения суммы результатов

Алгоритм, о котором я говорю, позволил бы вам представить его с x количеством элементов, каждый из которых имеет диапазон от a до b с результатом y. Я хотел бы иметь алгоритм, который при представлении описанных значений выводил бы вероятность того, что это произойдет.

Например, для двух кубиков. Поскольку я их уже знаю (из-за того, что возможные результаты такие низкие). Он сможет рассказать вам о каждой из возможностей.

Настройка будет примерно такой. х = 2 а = 1 б = 6. Если бы вы хотели узнать вероятность получения 2 баллов, тогда он просто выплюнул бы 1/36 (или это значение с плавающей запятой). Если вы добавите 7 в качестве общей суммы, получится 6.

Итак, мой вопрос: есть ли простой способ реализовать такую ​​вещь с помощью уже написанного алгоритма. Или нужно проходить каждую итерацию каждого элемента, чтобы получить общее количество комбинаций для каждого значения.

Точная формула также даст вам комбинации для получения каждого из значений от 1 до 12.

Таким образом, вы получите массив распределения с комбинациями каждой из них по каждому из индексов. Если это 0-12. Тогда 0 будет иметь 0, 1 будет иметь 0, а 2 будет иметь 1.

Я чувствую, что это тип проблемы, с которой кто-то еще столкнулся и хотел работать, и алгоритм уже готов. Если у кого-то есть простой способ сделать это, помимо простого перебора всех возможных значений, было бы здорово.

Я понятия не имею, почему я хочу, чтобы эта проблема была решена, но по какой-то причине сегодня у меня просто возникло чувство желания ее решить. И так как я гуглил и использовал вольфрам альфа, а также пробовал сам. Я думаю, пора признать поражение и спросить у сообщества.

Я бы хотел, чтобы алгоритм был на языке c или, может быть, PHP (хотя я бы предпочел, чтобы этого не было, так как он намного медленнее). Причина для c просто в том, что мне нужна чистая скорость, и я не хочу иметь дело с классами или объектами.

Псевдокод, или C - лучший способ показать ваш алгоритм.

Изменить:

] Кроме того, если я оскорбил человека с буквой «b» в его имени из-за того, что касается математики, мне очень жаль. Поскольку я не хотел обидеть, а просто хотел заявить, что я этого не понял. Но ответ мог бы остаться там, так как я уверен, что есть люди, которые могут прийти к этому вопросу и понять математику, стоящую за ним.

Также я не могу решить, каким образом я хочу это закодировать. Думаю, я попробую использовать оба, а затем решу, какой из них мне больше нравится видеть / использовать в моей маленькой библиотеке.

И последнее, что я забыл сказать, это то, что исчисление происходит примерно четыре года назад пять лет назад. Мое понимание вероятности, статистики и случайности пришло из моего собственного обучения, когда я смотрел код / ​​читал википедию / читал книги.

Если кому-то интересно, что вызвало этот вопрос. У меня была книга, которую я откладывал читать, под названием Прогулка пьяниц , а затем, когда я сказал XKCD 904, я решил, что пора наконец приступить к ее прочтению. Потом две ночи назад, когда я собирался спать ... Я размышлял, как решить этот вопрос с помощью простого алгоритма, и смог придумать один.

Мое понимание кода происходит от того, что я возился с другими программами, видел, что происходило, когда я что-то сломал, а затем пробовал свои собственные вещи, просматривая документацию по функциям сборки. Я понимаю большую нотацию O, читая википедию (насколько это возможно), а псевдокод был потому, что он очень похож на python. Я сам не умею писать псевдокод (как говорят учителя в колледже). Я все время получал примечания типа «сделайте его менее похожим на настоящий код, сделайте его более похожим на псевдокод». Эта вещь не изменилась.

Редактировать 2: Пусть любой, кто ищет этот вопрос, просто быстро захотел получить код. Я включил это ниже. Он лицензирован под LGPLv3, поскольку я уверен, что существуют эквиваленты этого кода с закрытым исходным кодом.

Он должен быть достаточно переносимым, поскольку он полностью написан на c. Если кто-то хотел превратить его в расширение на любом из различных языков, написанных на c, для этого потребовалось бы очень мало усилий. Я решил «пометить» первый файл, связанный с «Спроси доктора математики», как ответ, поскольку это была реализация, которую я использовал для этого вопроса.

Имя первого файла - «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-2019, 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;
}

А вот файл, который показывает реализацию, как я сказал в предыдущем файле.

#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));
}
10
задан 133794m3r 19 May 2019 в 19:40
поделиться