我正在尝试使用Java解决统计问题。我最终使用我的图形计算器来解决它,因为我没有通过我可怕的编程技巧解决它,但它仍然引起了我的兴趣。
以下是问题提示:
你有一副52张牌。 Aces取值1,face卡取值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);
编辑 - 在代码中发现了一个拼写错误,它现在返回0.0而不是NaN。我让for循环上升到200而不是100
答案 0 :(得分:2)
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 &gt; = n ,C( m , n )等于
m!
-------------
n! (m - n)!
但是在计算它时你不应该使用因子。如果你扩展这个并取消一些相同的因素,你就会得到
m * (m-1) * (m-2) * ... * (m-n+1)
---------------------------------
1 * 2 * ... * n
请注意,分子中的分子数与分母数相同。计算和避免溢出的最佳方法是从1开始,然后乘以 m / 1,然后( m -1)/ 2,然后( m -2)/ 3等,你可以通过循环轻松完成。
然后,如果你编写方法comb
来计算组合函数,你可以将其添加到result
:
Math.pow(EVEN_PROB, count) * Math.pow(ODD_PROB, (100 - count)) * comb(100,count)
答案 1 :(得分:0)
除法基础知识说int / int = int。 因此,您的变量EVEN_PROB,ODD_PROB等于零。 你可能想试试这个:
final double EVEN_PROB = 8.0 / 13.0;
final double ODD_PROB = 5.0 / 13.0;