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