编写一个Java程序,该程序将启动4个线程,其中3个是掷硬币线程,1个是主线程。每个掷硬币线程将连续掷出若干次硬币(10次以内,次数随机生成);主线程将打印出正面出现的总次数以及正面出现的概率。注意:因为要计算数量以及出现概率,所以必须将所有子线程内的数据同步到主线程内。
package Ch04HomeWork;
public class CoinTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int PositiveNum = 0;//正面次数
int totalNum = 0;//总次数
//创建三个子线程
Coin[] coins = new Coin[3];
for(int i=0;i<3;i++) {
coins[i] = new Coin();
}
Thread t1 = new Thread(coins[0]);
Thread t2 = new Thread(coins[1]);
Thread t3 = new Thread(coins[2]);
t1.start();
t2.start();
t3.start();
//主线程等待子线程执行完毕再统计硬币数
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//赋值
for(int i=0;i<3;i++) {
PositiveNum += coins[i].getPositiveNum();
totalNum += coins[i].getNum();
}
//保留两位小数
double number = (double)PositiveNum/(double)totalNum;//求正面概率
System.out.println("掷硬币总次数:"+totalNum+"次, 正面出现的总次数是:"+PositiveNum+
"次, 正面出现的概率是:"+String.format("%.2f",number));
}
}
class Coin implements Runnable{
private int num = 0; //掷硬币次数
private int positiveNum = 0; //正面次数
public void run() {
//连续掷出若随机次硬币
num = (int) (Math.random() * 10 + 1);
//模拟掷硬币
for(int i = 0;i < this.num;i++) {
int result = (int)(Math.random()*10)>5?1:0;
if(result == 1){//抛到正面
this.positiveNum ++;
}
}
}
public int getNum() {
return num;
}
public int getPositiveNum() {
return positiveNum;
}
}
这段代码实现了一个掷硬币模拟程序,通过多线程来模拟多次掷硬币的过程,并统计正面出现的概率。
-
在
CoinTest
类的main
方法中,创建了三个Coin
实例,分别用于模拟三次独立的掷硬币过程。 -
创建三个线程
t1
、t2
和t3
,分别用于执行这三个Coin
实例的任务。 -
启动三个线程。
-
使用
t1.join()
、t2.join()
和t3.join()
让主线程等待这三个子线程执行完毕,然后再统计结果。 -
创建了一个
Coin
类实现了Runnable
接口,用于模拟掷硬币的线程任务。 -
Coin
类中有num
(掷硬币次数)和positiveNum
(正面次数)两个成员变量。 -
在
run
方法中,先随机生成一个掷硬币次数num
(范围是 1 到 10)。 -
使用循环模拟实际的掷硬币过程,随机生成一个结果,如果结果大于 5,则认为是正面。
-
如果结果为正面,增加
positiveNum
计数。 -
在
CoinTest
的主方法中,使用循环遍历每个Coin
实例,获取其num
和positiveNum
值,用于统计总的掷硬币次数和正面出现的总次数。 -
计算正面出现的概率,使用
(double)PositiveNum / (double)totalNum
,并使用String.format("%.2f", number)
来保留两位小数打印出来。
总体来说,这段代码通过多线程模拟了多次掷硬币的过程,并统计了正面出现的概率。每个子线程随机生成掷硬币次数,然后根据随机结果统计正面出现的次数。最终主线程等待所有子线程完成任务,然后计算概率并打印结果。