最近在看Java核心技术这本经典的书,由于是从英文翻译过来的,总感觉看的有一点不通顺,就想写写博客,给大家分享一下我从中学到的知识
3-5的想要实现什么:
假设你买了一张彩票,上面写着6个1至50的数字,等开奖的时候,公布的6个数字与你彩票上数字相同的概率会是多少呢?
这里得提前说明一下,中奖不会要求顺序也一样哦,要不然,我觉得实在是太难中奖了。
代码部分:
package java_book;
import java.util.*;
/*
题目要求,如在50个数里面抽取6个数,求抽中的概率,比买彩排概率更高,是组合问题
在这里拓宽为自定义操作
可以定义总数和抽的数量
*/
public class S3_5 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//确认抽奖总数
System.out.println("输入抽奖总数");
int n = in.nextInt();
//确认抽的次数
System.out.println("输入抽多少次");
int k = in.nextInt();
//计算概率
int rate = 1;
for (int j = 1; j <= k; j++) {
rate = rate * (n - j + 1) / j;
}
System.out.println(1 + "/" + rate);
}
}
这是我自己写的,跟书上不完全一样,不过,代码的核心其实在计算概率那一部分,怎样把我们高中学习的组合问题用代码来实现
大家可以看书上第71页中间的式子,细心的观察,就会发现无论是分子还是分母,都呈现递加的态势,而且,他们的长度正好相同,这不正好可以用for来实现吗,只需要找到规律,就能够写出关键的for循环代码。
而且,这个程序清单还有一些值得我们学习的地方,在计算概率的部分,我们都会习惯的去用小的数除以大的数,得到一个小于1的分数,但是在书中,作者反其道而行之,用大的数除以小的数,我想,这是因为编程中浮点数的尴尬吧,由于二进制的原因,精度会损失,整型数还需要先转化成浮点数再相除,用作者的方法后,明显好了很多,只需要在输出的部分简单转化一下,就能够将得到想要的结果了