Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java解决统计概率?_Java_Statistics - Fatal编程技术网

通过Java解决统计概率?

通过Java解决统计概率?,java,statistics,Java,Statistics,我试图用Java解决一个统计问题。在我糟糕的编程技巧解决不了问题后,我最终用我的图形计算器来解决它,但它仍然激起了我的兴趣 问题提示如下: 你有一副52张牌。A的值为1,脸牌的值为10。如果我们随机挑选100张卡片,并进行替换,那么100张卡片的总和为偶数的概率是多少 这是我到目前为止得到的结果,但是当我试图返回结果时,我得到了NaN。很抱歉,如果我的问题太基本或者我的编程能力很差,但是我认为我的思路是正确的,不知道为什么它不起作用。这与小数非常小有关吗 final double EVE

我试图用Java解决一个统计问题。在我糟糕的编程技巧解决不了问题后,我最终用我的图形计算器来解决它,但它仍然激起了我的兴趣

问题提示如下:

你有一副52张牌。A的值为1,脸牌的值为10。如果我们随机挑选100张卡片,并进行替换,那么100张卡片的总和为偶数的概率是多少

这是我到目前为止得到的结果,但是当我试图返回结果时,我得到了NaN。很抱歉,如果我的问题太基本或者我的编程能力很差,但是我认为我的思路是正确的,不知道为什么它不起作用。这与小数非常小有关吗

    final double EVEN_PROB = 8 / 13;
    final double ODD_PROB = 5 / 13;
    double result = 0;


    for (int count = 0; count <= 100; count++)
    {
        if (count % 2 == 0)
        {
           result += (Math.pow(EVEN_PROB, count)) * (Math.pow(ODD_PROB, (100 - count)));
        }
    }
    System.out.println(result);
最终双倍偶数概率=8/13;
最终双奇数概率=5/13;
双结果=0;

对于(int count=0;count除法的基本原理是int/int=int)。 因此,变量偶数PROB,奇数PROB等于零。 您可能希望尝试以下方法:

final double EVEN_PROB = 8.0 / 13.0;
final double ODD_PROB = 5.0 / 13.0;

除法的基本原理是int/int=int。 因此,变量偶数PROB,奇数PROB等于零。 您可能希望尝试以下方法:

final double EVEN_PROB = 8.0 / 13.0;
final double ODD_PROB = 5.0 / 13.0;

Rahul指出的第一个问题是8/13是整数除法,因为两个操作数都是整数,即使将结果变量声明为
double
。因此它返回0。您需要使用
8.0/13.0
5.0/13.0

更大的问题是你的公式是错误的。比如说
count=50
;此时,你正试图计算你抽50张偶数卡和50张奇数卡的概率。你的公式计算(8/13)50(5/13)50.这样做的目的是计算第一张牌是偶数,第二张牌是偶数,…第50张牌是偶数,第51张牌是奇数,第52张牌是奇数…而第100张牌是奇数。但这只是你可以抽取的许多可能的牌序中的一张。你不会计算任何其他可能的序列,这些序列加起来就是50张偶数卡和50张奇数卡

要解决这个问题,需要进行乘法运算

Math.pow(EVEN_PROB, count) * Math.pow(ODD_PROB, (100 - count))
通过组合函数。如果
count
为50,这将是100个事物的组合数,每次取50,通常写为C(100,50)。对于非负整数m和n,其中m>=n,C(m,n)等于

但在计算它时不应该使用阶乘。如果你展开它并取消一些相同的因子,你会得到

m * (m-1) * (m-2) * ... * (m-n+1)
---------------------------------
        1 * 2 * ... * n
请注意,分子中的因子数与分母中的因子数相同。计算此数并避免溢出的最佳方法是从1开始,然后乘以m/1,然后(m-1)/2,然后(m-2)/3,等等,这在循环中很容易做到

然后,如果您编写一个方法
comb
来计算组合函数,您将把它添加到
结果中

Math.pow(EVEN_PROB, count) * Math.pow(ODD_PROB, (100 - count)) * comb(100,count)

Rahul指出的第一个问题是8/13是整数除法,因为两个操作数都是整数,即使将结果变量声明为
double
。因此它返回0。您需要使用
8.0/13.0
5.0/13.0

更大的问题是你的公式是错误的。比如说
count=50
;此时,你正试图计算你抽50张偶数卡和50张奇数卡的概率。你的公式计算(8/13)50(5/13)50.这样做的目的是计算第一张牌是偶数,第二张牌是偶数,…第50张牌是偶数,第51张牌是奇数,第52张牌是奇数…而第100张牌是奇数。但这只是你可以抽取的许多可能的牌序中的一张。你不会计算任何其他可能的序列,这些序列加起来就是50张偶数卡和50张奇数卡

要解决这个问题,需要进行乘法运算

Math.pow(EVEN_PROB, count) * Math.pow(ODD_PROB, (100 - count))
通过组合函数。如果
count
为50,这将是100个事物的组合数,每次取50,通常写为C(100,50)。对于非负整数m和n,其中m>=n,C(m,n)等于

但在计算它时不应该使用阶乘。如果你展开它并取消一些相同的因子,你会得到

m * (m-1) * (m-2) * ... * (m-n+1)
---------------------------------
        1 * 2 * ... * n
请注意,分子中的因子数与分母中的因子数相同。计算此数并避免溢出的最佳方法是从1开始,然后乘以m/1,然后(m-1)/2,然后(m-2)/3,等等,这在循环中很容易做到

然后,如果您编写一个方法
comb
来计算组合函数,您将把它添加到
结果中

Math.pow(EVEN_PROB, count) * Math.pow(ODD_PROB, (100 - count)) * comb(100,count)

这是因为
Math.pow(奇数PROB,(100-计数))
将在计数超过
100时开始返回
Infinity
。更改它是一个输入错误。我的意思是键入100,了解它为什么返回0.0而不是实际概率吗?这是因为
Math.pow(奇数PROB,(100-计数))
将在计数超过
100
后立即开始返回
无穷大。更改它是一个输入错误。我想键入100,了解它返回0.0而不是实际概率的原因吗?好的,刚刚更改了我的代码,现在程序结束时,我的结果等于1.3482760979229682E-21。这肯定不正确吗?结果是错误的因为结果的方程式不正确。对于count=1,总和将不为偶数(1偶数+99赔率为奇数)。同样,你必须消除其他情况。@RahulAgrawal他已经消除了这些情况,你看到他的
if
语句了吗?此外,如果他添加了不应该添加的内容,最终结果也不会太小。这就是为什么我使用if语句的原因。只有当count%2==0,或者count为偶数。当计数为奇数时,结果的方程式不被称为结果,因为结果的方程式不正确。对于计数=1,总和将不为偶数(1偶数+99赔率为奇数)。同样,您必须排除其他情况。A