2021-10-24 我的第五次java作业:二项分布和双骰子赌博问题

我的第五次java作业

题目:

二项分布是n次独立试验中成功次数k的离散概率分布,其中每次试验成功的概率为p。利用Java Math类中提供的数学函数,给出二项分布X~B(n, p, k)的实现代码并进行测试。例如,当用户给定n=20, p=0.1, k=5的概率应为0.03192136。

代码

package calculation;
import java.math.BigDecimal;
import java.util.Scanner;
public class calculation {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner (System.in);
		System.out.println("请一次输入n.k.p");
		int n=sc.nextInt();
		int k=sc.nextInt();
		double p=sc.nextDouble();
		double result=(factorial(n)/(factorial(k)*factorial(n-k)))*(Math.pow(p, k))*(Math.pow((1-p), n-k));
		double A=(factorial(n)/(factorial(k)*factorial(n-k)));
		//System.out.println(Math.pow(p, (n-k)));
		//System.out.println(Math.pow((1-p), k));
		
		BigDecimal finalresult=new BigDecimal(result);
		String ii=finalresult.toPlainString();
		System.out.println(ii);//解决的问题是如何将double类型的结果的科学记数法表示形式转化为小数,
		
		sc.close();
	}
	public static long factorial(int n)//阶乘函数
	{
		long result=n;
		for(int i=n-1;i>=1;i--)
		{
			result=result*i;
		}
		return result;
	}


}

实验截图

问题与收获思考:

实验1:没有解决的问题是最后的结果保留小数的位数问题;
解决的问题是如何将double类型的结果的科学记数法表示形式转化为小数,运用了

import java.math.BigDecimal;
BigDecimal finalresult=new BigDecimal(result);
String ii=finalresult.toPlainString();
System.out.println(ii);

题目:

在这里插入图片描述

代码

package crap;

public class crap {
	public static void main(String []args)
	{
		System.out.println("这是胡竞文(201911030235)的java作业");
		System.out.println("现在开始掷骰子");
		int firstround=play();
		if(firstround==2 ||firstround==12||firstround==3)
		{
			System.out.println("you lose");
			
		}
		else if(firstround==7 ||firstround==11)
		{
			System.out.println("you win");
		}
		else 
		{
			System.out.println("point is"+firstround);
			int nextround=0;
			nextround=play();
			while(nextround!=firstround && nextround!=7)//就是这个地方出现了问题,要注意java中的循环不能好多个if后加else,可以用考虑用while循环改写
			{
				
				nextround=play();
			
			}
			if(nextround==7) 
			{System.out.println("you lose");}
			else if(nextround==firstround) 
			System.out.println("you win");
		}
	}
	public static int play()
	{
		int result=0;
		int num1=(int)Math.ceil( 6*Math.random());
		int num2=(int)Math.ceil( 6*Math.random());
		result=num1+num2;
		System.out.println("you roled"+num1+"+"+num2+"="+result);
		return result;
	}

}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题与收获思考:

对于循环问题,我觉得最后这一句代码特别值得注意,

while(nextround!=firstround && nextround!=7)

一开始我写成了for循环

for(i=1; nextround==firstround ||nextround==7;i++)

但其实这个有多个错误,第一个错误是我应该用!=而不是==,终止条件的意思是当循环满足这个条件的时候会继续循环,不满足这个条件了才会挑出来,再一个,这个循环用while更好,i在里面没有起作用。再一个,我用错了符号,不应该用||,而应该用&&,因为两个判断条件都是否定,应该两个都不满足才在循环里,如果用||就表示两个中的任意一个满足或者都不满足就会继续循环,然而两个都不满足是一定的,所以就会一直在循环里,就造成了一开始无限循环的错误结果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值