JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 請問這兩種擲硬幣的寫法哪一種效率較高或較好?
fredfred690





發文: 66
積分: 0
於 2012-02-11 03:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
以下是我寫的:
1
2
3
4
5
6
7
8
9
10
11
public class FilpCoin{
  public static void main(String[] args){
    boolean coin;
    Random r=new Random();
    coin=r.nextBoolean();    
    if(coin==true)  
      System.out.println("Coin is positive");
    else
      System.out.println("Coin is Negative");
  }
}


以下為範例的解答:
因為他有呼叫自己寫的類別的print方法,所以才能用print的方式印出。
1
2
3
4
5
6
7
8
9
10
import java.util.*; 
import static net.mindview.util.Print.*;
public class CoinToss {
  public static void main(String[] args) {
    Random rand = new Random();
    int coin = rand.nextInt();
    if(coin % 2 == 0) print("heads");
    else print("tails");    
  }
}


1.用int會比較省時嗎?
2.這程式能再簡化嗎?


reply to postreply to post
作者 Re:請問這兩種擲硬幣的寫法哪一種效率較高或較好? [Re:fredfred690]
jimwayne





發文: 220
積分: 0
於 2012-02-12 19:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
個人覺得 boolean 應該會快很多,因為不用算餘數
不過樓主的寫法還有辦法再更精簡一點點
以下是小弟測試的程式碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
long start, end;
long times = 10000000;
int[] count = new int[2];
count[0] = 0;
count[1] = 0;
Random ran;
 
start = Calendar.getInstance().getTimeInMillis();
ran = new Random();
for(int i=0 ; i<times ; i++) {
  if(ran.nextInt() % 2 == 0) ++count[0];
  else ++count[1];
}
end = Calendar.getInstance().getTimeInMillis();
System.out.println("P: " + count[0] + " ; N: " + count[1]);
System.out.println("Exection time of int: " + (end-start) + "ms");
 
count[0] = 0;
count[1] = 0;
 
start = Calendar.getInstance().getTimeInMillis();
ran = new Random();
for(int i=0 ; i<times ; i++) {
  if(ran.nextBoolean()) ++count[0];
  else ++count[1];
}
end = Calendar.getInstance().getTimeInMillis();
System.out.println("P: " + count[0] + " ; N: " + count[1]);
System.out.println("Exection time of boolean: " + (end-start) + "ms");


執行出來的結果:
#1
P: 5000118 ; N: 4999882
Exection time of int: 324ms
P: 4999258 ; N: 5000742
Exection time of boolean: 248ms

#2
P: 4999907 ; N: 5000093
Exection time of int: 495ms
P: 4998063 ; N: 5001937
Exection time of boolean: 262ms

#3
P: 4999883 ; N: 5000117
Exection time of int: 371ms
P: 4999882 ; N: 5000118
Exection time of boolean: 278ms

#4
P: 5000052 ; N: 4999948
Exection time of int: 402ms
P: 4999493 ; N: 5000507
Exection time of boolean: 278ms

後面不列了。小弟跑了很多次,結果都差不多這樣
以 #4 為例,int 跑出來正面 5000052 次、反面 4999948 次
boolean 跑出來正面 4999493、反面 5000507 次
數字不一樣可以證明程式真的有跑完 1000 萬次
boolean 完勝~XD


jimwayne edited on 2012-02-19 15:30
reply to postreply to post
Java 工作者,但仍然是個初心者.....
作者 Re:請問這兩種擲硬幣的寫法哪一種效率較高或較好? [Re:fredfred690]
worookie

Small Ship

版主

發文: 2092
積分: 21
於 2012-02-13 22:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
產生一個 boolean 只需一個 bit, 但產生一個 int 則需 32 bits.
所以當然是用 boolean 快了.


reply to postreply to post
作者 Re:請問這兩種擲硬幣的寫法哪一種效率較高或較好? [Re:worookie]
T55555

Java, Ruby, Haskell

版主

發文: 1026
積分: 24
於 2012-02-14 07:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
worookie wrote:
產生一個 boolean 只需一個 bit, 但產生一個 int 則需 32 bits.
所以當然是用 boolean 快了.


的確 boolean 快過 int;
不過他 test 的結果 boolean 沒有快過 int 32 倍
所以更快的方法或許產生一個 int 然後拆成 32 個 bits 來使用.


reply to postreply to post
作者 Re:請問這兩種擲硬幣的寫法哪一種效率較高或較好? [Re:T55555]
fredfred690





發文: 66
積分: 0
於 2012-02-14 14:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
T55555 wrote:
的確 boolean 快過 int;
不過他 test 的結果 boolean 沒有快過 int 32 倍
所以更快的方法或許產生一個 int 然後拆成 32 個 bits 來使用.


請問你是如何測試的??
因為我用我的程式去測的結果時間竟然相同(可能是我只有執行1次所以速度太快才會使兩個的結果相同)。

如果用迴圈執行n次確實會發現boolean比較快
但我重覆執行程式多次後發現偶爾1.2次的boolean比int多了點時間,是哪裡出了問題?


fredfred690 edited on 2012-02-14 14:58
reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8