C 一种计算结果和发生概率的算法

C 一种计算结果和发生概率的算法,c,algorithm,probability,C,Algorithm,Probability,我所说的算法允许你用x个项目来表示,每个项目的范围是a到b,结果是y。我想有一个算法,当给出所描述的值时,它将输出它发生的可能性 例如,对于两个模具。因为我已经知道了(因为可能的结果很低)。它能告诉你每一种可能性 设置类似于。x=2A=1B=6。如果你想知道结果是2的可能性。然后它会简单地吐出1/36(或它的浮点值)。如果你把7作为总数,它会告诉你6 所以我的问题是,有没有一种简单的方法可以通过已经编写好的算法来实现这样的事情。或者,你必须对每一项进行每一次迭代,才能得到每个值的组合总数 精确的

我所说的算法允许你用x个项目来表示,每个项目的范围是a到b,结果是y。我想有一个算法,当给出所描述的值时,它将输出它发生的可能性

例如,对于两个模具。因为我已经知道了(因为可能的结果很低)。它能告诉你每一种可能性

设置类似于。x=2A=1B=6。如果你想知道结果是2的可能性。然后它会简单地吐出1/36(或它的浮点值)。如果你把7作为总数,它会告诉你6

所以我的问题是,有没有一种简单的方法可以通过已经编写好的算法来实现这样的事情。或者,你必须对每一项进行每一次迭代,才能得到每个值的组合总数

精确的公式也会给出组合,使每个值从1到12

因此,它将为您提供一个分布数组,其中包含每个索引的每个组合。如果是0-12。然后0将有0,1将有0,2将有1

我觉得这是其他人曾经遇到过的问题,他们想要解决,而且算法已经完成了。如果有人有一个简单的方法来做这件事,而不仅仅是简单地循环通过每一个可能的值,那将是非常棒的

我不知道为什么我想解决这个问题,但出于某种原因,今天我有一种想解决它的感觉。因为我一直在谷歌上搜索,使用wolfram alpha,并亲自尝试。我认为是时候承认失败并向社区提出要求了

我希望算法使用c语言,或者PHP语言(尽管我不希望使用,因为它要慢得多)。使用c的原因很简单,因为我想要原始速度,并且我不想处理类或对象

伪代码或C是显示算法的最佳方式

编辑:

另外,如果我因为数学的问题冒犯了一个名字中有“b”的人,我很抱歉。因为我无意冒犯,但我只想说我不明白。但答案可能会留在那里,因为我相信有人可能会想到这个问题,并理解其背后的数学原理

我也不能决定我想用哪种方式来编码。我想我会尝试使用两者,然后决定在我的小图书馆里我更喜欢看/使用哪一个

我忘了说的最后一件事是,微积分大约是五年前开始的。我对概率、统计学和随机性的理解来自于我自己通过阅读代码/阅读维基百科/阅读书籍的学习

如果有人好奇是什么引发了这个问题。我有一本书,我推迟了阅读,书名叫《醉汉漫步》,当我说XKCD 904时,我决定是时候开始阅读了。两天前的晚上,我正要睡觉的时候。。。我曾经思考过如何通过一个简单的算法来解决这个问题,并且能够想到一个

我对代码的编码理解来自于对其他程序的修补,看到我弄坏了什么东西时发生了什么,然后在查看内置函数的文档时尝试自己的东西。通过阅读wikipedia(尽可能多地了解),我确实理解了大O符号,而伪代码是因为它与python非常相似。我自己也不能写伪代码(或者说是大学老师说的)。我不断收到类似“让它不那么像真实代码,让它更像伪代码”的注释,但这一点并没有改变

编辑2:以防搜索此问题的人很快就想要代码。我把它包括在下面。它是在LGPLv3下许可的,因为我确信存在此代码的封闭源代码等价物

它应该是相当可移植的,因为它完全是用c编写的。如果你想把它变成用c语言编写的各种语言中的一种扩展,那么这样做应该不费吹灰之力。我选择“标记”第一个链接到“问数学博士”的答案,因为这是我用于这个问题的实现

第一个文件的名称是“sum_probability.c”


要获得所有可能性,您可以制作一张价值地图:

for (i=a to b) {
 for (j=a to b) {
  map.put(i+j, 1+map.get(i+j))
 }
}
为了更有效地计算和,您可以使用该模式 67,56,45,34,23,12

该模式适用于nxn网格,将有n(n+1)'s,和大于或小于1的可能性较小

这将计算可能性,例如,count(6,1/2/3/4/5/6)将给出骰子总和的可能性

import math
def Count(poss,sumto):
  return poss - math.fabs(sumto-(poss+1));
编辑:在C中,这将是:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>;

int count(int poss, int sumto)
{
  return poss - abs(sumto-(poss+1));
}

int main(int argc, char** argv) {
    printf("With two dice,\n");
    int i;
    for (i=1; i<= 13; i++)
    {
        printf("%d ways to sum to %d\n",count(6,i),i);
    }
    return (EXIT_SUCCESS);
}

数论、统计学和组合学让你相信,要得到一个事件概率的数值,你必须知道两件事:

  • 可能结果的数量
  • 在一组总结果中,有多少等于您所寻求的概率值为“y”的结果
在伪代码中:

numPossibleOutcomes = calcNumOutcomes(x, a, b);
numSpecificOutcomes = calcSpecificOutcome(y);
probabilityOfOutcome = numSpecificOutcomes / numPossibleOutcomes;

然后只需对上面的两个函数进行编码,这应该很容易。

首先,您不需要担心从
a
b
的范围。您可以从
y
中减去
a*x
,然后假装范围从
0
b-a
。(因为每个项目在总和中至少贡献了
a
,所以您可以为每个
x
项目减去
a
。)

其次,请注意,您真正想要做的是计算实现特定总和的方法的数量。概率就是计数除以一个简单的指数
(b-a+1)^x

大约在十年前,“问数学博士”一书就讨论了这个问题:

他的公式是假设骰子数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>;

int count(int poss, int sumto)
{
  return poss - abs(sumto-(poss+1));
}

int main(int argc, char** argv) {
    printf("With two dice,\n");
    int i;
    for (i=1; i<= 13; i++)
    {
        printf("%d ways to sum to %d\n",count(6,i),i);
    }
    return (EXIT_SUCCESS);
}
With two dice,
0 ways to sum to 1
1 ways to sum to 2
2 ways to sum to 3
3 ways to sum to 4
4 ways to sum to 5
5 ways to sum to 6
6 ways to sum to 7
5 ways to sum to 8
4 ways to sum to 9
3 ways to sum to 10
2 ways to sum to 11
1 ways to sum to 12
0 ways to sum to 13
numPossibleOutcomes = calcNumOutcomes(x, a, b);
numSpecificOutcomes = calcSpecificOutcome(y);
probabilityOfOutcome = numSpecificOutcomes / numPossibleOutcomes;
z + z^2 + z^3 + z^4 + z^5 + z^6
z^2 + 2z^3 + 3z^4 +4z^5 + 5z^6 + 6z^7 + 5z^8 + 4z^9 + 3z^10 + 2z^11 + z^12
f(a, b, n, x) = f(0, b-a, n, x-n*a)
f(0, m, n-1, x-c)
f(0,m,n,x) = f(0,m,n-1,x) + f(0,m,n-1,x-1) + ... + f(0,m,n-1,x-m)