《java核心技术》程序清单3-5

最近在看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的分数,但是在书中,作者反其道而行之,用大的数除以小的数,我想,这是因为编程中浮点数的尴尬吧,由于二进制的原因,精度会损失,整型数还需要先转化成浮点数再相除,用作者的方法后,明显好了很多,只需要在输出的部分简单转化一下,就能够将得到想要的结果了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值