昨天寫的龜兔賽跑中存在一些問題,今天聽老師講解后清楚了許多,但是個人感覺老師的邏輯比較復(fù)雜(可能是我想的太簡單-_-),所以把老師和自己昨天的思路整合一下力惯,重新寫了一下~
先上題目
一放棒、題目:
實(shí)現(xiàn)龜兔賽跑
提示:可以采用Math.random()取得0~1之間的隨機(jī)數(shù)模擬比賽進(jìn)程, 如總距離為100米站欺,在隨機(jī)數(shù)00.3之間代表兔子跑姨夹,每次跑2米,在0.31之間代表烏龜跑矾策,每次跑1 米磷账,先跑完100米者為勝利者
結(jié)構(gòu):
Race類:產(chǎn)生RabbitAndTurtle的兩個實(shí)例,分別代表兔子和烏龜
RabbitAndTurtle類:繼承Thread類贾虽,實(shí)現(xiàn)賽跑的邏輯
二逃糟、實(shí)現(xiàn)
Race類:這個和昨天的一樣,直接調(diào)用方法就可以了
public class Race {
public static void main(String[] args) {
RabbitAndTurtle rabbit = new RabbitAndTurtle("小白兔子");
RabbitAndTurtle turtle = new RabbitAndTurtle("烏龜");
rabbit.start();
turtle.start();
}
}
RabbitAndTurtle類
public class RabbitAndTurtle extends Thread {
public RabbitAndTurtle(String name) {
// TODO Auto-generated constructor stub
super(name);
}
public int distance = 100;
static boolean flag = true;
public int predistance = 0;
@Override
public void run() {
double ran = Math.random();
String name = Thread.currentThread().getName();
while (flag) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (name.equals("烏龜")) {
if (Math.random() < 1) {
predistance += 1;
System.out.println(name + "我跑了:" + predistance + "米");
if (predistance == 100) {
System.out.println("=================烏龜贏了=================");
flag = false;
break;
}
}
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (name.equals("小白兔子")) {
if (Math.random() < 0.3) {
predistance += 2;
System.out.println(name + "我跑了:" + predistance + "米");
if (predistance == 100) {
System.out.println("=================小白兔子贏了=================");
flag = false;
break;
}
}
}
try {
sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
其實(shí)變化不大 主要是加了Math.random()和sleep()兩個方法
下面說一下這兩個方法的具體作用
if (name.equals("小白兔子")) {
if (Math.random() < 0.3) {
predistance += 2;
System.out.println(name + "我跑了:" + predistance + "米");
if (predistance == 100) {
System.out.println("=================小白兔子贏了=================");
flag = false;
break;
}
}
}
因?yàn)樾⊥米优艿谋容^快蓬豁,為了使結(jié)果更加的公平绰咽,讓贏者更隨機(jī)所以使用Math.random()方法,當(dāng)產(chǎn)生的隨機(jī)數(shù)在[0,0.3]時兔子才可以移動地粪,當(dāng)產(chǎn)生的隨機(jī)數(shù)在(0.3,1)的時候?yàn)觚斚蚯耙苿尤∧迹篂觚斚蚯暗母怕首兇螅ó?dāng)老師說到這一點(diǎn)的時候我簡直翻白眼-_-,怪不得我昨天百思不得其解這個隨機(jī)數(shù)要怎么用)sleep()方法同理,在兔子移動后可以使用sleep()讓其進(jìn)入阻塞狀態(tài)從而使烏龜線程有更大的概率獲得cpu資源
運(yùn)行結(jié)果:
昨天的運(yùn)行結(jié)果:
對比兩張圖可以看到今天的結(jié)果隨機(jī)性更強(qiáng)而且一個跑完線程就停止了另一個也不會繼續(xù)進(jìn)行