2016-04-27 9 views
1

私は現在学校への割り当てを行っていますが、Math.random()を使用してランダムな値を取得するプログラムを作成する必要があります。 「頭」または「尾」。これを10回行う必要があります。次に、プログラムの出力が何パーセントになるか、何回出力されるかを調べる必要があります。ただし、正しく動作していません。それは常にヘッド/テールがトーセンスの0%であったことを出力します。誰かが理由を説明できますか?2つの値は商を生成しません

public class HeadsTails 
{ 
    public static void main(String[] args) 
    { 
     int v; 
     double i; 

     int heads = 0, tails = 0; 

     double headsPercent, tailsPercent; 

     for(v = 1; v <= 10; ++v) 
     { 
      i = Math.random(); 
      if(i <= 0.5) 
      { 
       System.out.println("Heads"); 
       heads = heads + 1; 
      } 
      else if(i > 0.5) 
      { 
       System.out.println("Tails"); 
       tails = tails + 1; 
      } 
     } 
     headsPercent = (heads/10) * 100; 
     tailsPercent = (tails/10) * 100; 
     System.out.println("Heads were " + headsPercent + "% of the tosses."); 
     System.out.println("Tails were " + tailsPercent + "% of the tosses."); 
    } 
} 

私はまた、プログラムを正しく機能させるだけでなく、改善することができます。

+0

、結果は分割can'tいるので、 '0'または '1'にな​​ります浮動小数点を持ちます。 – SomeJavaGuy

+0

@Tomああ、これは確かにその質問の複製です。私の悪い、まだこの全体のセットアップに新しい。 – ImMetaKnight

答えて

1

問題は整数の数学です。 headstailsので、両方のint次のとおりです。

heads/10 

は... 9/10int -land、1/102/10、内のすべての0をしているため、ほとんどの場合、あなたのケースで0になりますint結果を、得られます。あなたが他のものを手に入れる唯一の時間は、すべてのロールが頭部だった場合、またはすべてが尾部だった場合です。10/101です。数学を行う前にdouble

出演:

headsPercent = ((double)heads/10) * 100; 
tailsPercent = ((double)tails/10) * 100; 

そのfixes the problemを行います。


サイド注1:あなたが+=、例えばを使用して変数に追加することができます。

heads += x; 

そしてもちろん、何を追加していること1で、あなただけのインクリメント演算子を使用することができ、接頭語のいずれか:

++heads; 

または接尾

heads++; 

headstailsを更新するという点で、それはどの問題ではありません。)

サイド注2:あなたはelse if (i > 0.5)を必要としません。ロジックについて考えるなら、if (i <= 0.5) ... else ...です。つまり、if (i > 0.5)の部分は必要ありません。elseになると、iは間違いなく> 0.5になります。

そして、あなたはそれを行う場合、あなたももうiは必要ありません:あなたはintiger分裂を行っている

for(v = 1; v <= 10; ++v) 
{ 
    if(Math.random() <= 0.5) 
    { 
     System.out.println("Heads"); 
     ++heads; 
    } 
    else 
    { 
     System.out.println("Tails"); 
     ++tails; 
    } 
} 
+1

または、キャスティングが本当に悪い場合は、「10.0」と「100.0」または「10f」と「100f」を使用できます。 – OldCurmudgeon

+0

@OldCurmudgeon:良い点。これはキャストのための比較的妥当なユースケースの1つですが、実際にはリテラルの2倍の値を使用できます。 (しかし、私は実際にリテラルフロートを使用しません。)これは明示的なキャストと暗黙の*数値の宣伝を 'int'(そしてより微妙なもの)に置き換えているので、キャストは正しいものです。しかし、それもうまくいくでしょう。 –

+1

うわー、それはかなり深いものでした。私は頭と尾を二重に固定するのを忘れていたとは信じられません。また、私は+ =、接頭辞、および接尾辞を知っていましたが、私がそれらに慣れていないので、私はそれらを使用しませんでした。私は今でもそうです。ありがとう、これは過去数時間の私の正気でかわいいです。 – ImMetaKnight

関連する問題