2017-01-11 26 views
-1

私は誕生日のパラドックスを表すプログラムを作ろうとしています。私はパラドックスを理解し、私のコードは間違っていると確信していますが、どこが間違っているのか分かりません。私は関連する記事を見てきましたが、役に立たないものは何も見つかりませんでした。私は若い頃にコードを書いていたので、ちょっと混乱してもごめんなさい。私はそれを行う他の方法があることを知っています、そして、なぜそれらの仕事を理解します。私はちょうど私のコードが動作しない理由を知りたい。ありがとう!Java:誕生日のパラドックス

EDIT:申し訳ありません。私の実際の問題が何であったかを忘れてしまった。私はそれを実行し、理論値である約50.5%を得ることを期待しています。しかし、代わりに、私は約21.1%を取得します。

public class Main { 
    static int trialsSucceeded = 0; // Stores number of successful trials 
    static final int TRIALS = 1000000; // 1,000,000 is a good number :) Biggest I've tried: 2,147,483,647, which is Integer.MAX_VALUE 
    static int numberOfPeople = 23; // The 'n' value for the birthday paradox 

public static void main(String[] args) { 
    ArrayList<Integer> birthdays = new ArrayList<Integer>(); // Stores people's birthdays 

    // Runs until desired trials are completed 
    for (int trialNumber = 0; trialNumber < TRIALS; trialNumber++) { 
     // Provides progress updates to user 
     if (trialNumber % 1000 == 0) 
      System.out.printf("%.1f%% complete\n", (double) trialNumber * 100/TRIALS); 

     // Populates the birthdays array 
     for (int personNumber = 0; personNumber < numberOfPeople; personNumber++) { 
      birthdays.add(getRandInt(1, 365)); 
     } 

     // Used later to see if current trial should end 
     int prevTrialsSucceeded = trialsSucceeded; 

     // Checks each person's birthday against everyone else's 
     for (int i = 0; i < birthdays.size(); i++) { 
      for (int j = i + 1; j < birthdays.size(); j++) { 
       // If birthdays match, marks trial as a success jumps to next trail 
       if ((birthdays.get(i) == birthdays.get(j))) { 
        trialsSucceeded += 1; 
        break; 
       } 
      } 
      // Jumps to next trial if this one has already succeeded 
      if (prevTrialsSucceeded != trialsSucceeded) { 
       break; 
      } 
     } 
     // Clears list of birthdays to get ready for next trial 
     birthdays.clear(); 
    } 
    // Tells user ratio of successful trials to total trials 
    System.out.println(((double) trialsSucceeded/TRIALS * 100) + "% of trials succeeded"); 
} 

private static int getRandInt(int lowerBound, int upperBound) { 
    // Returns random integer between lowerBound and upperBound 
    Random random = new Random(); 
    return random.nextInt(upperBound - lowerBound + 1) + lowerBound; 
} 

}

+2

コード[動作しません](http://importblogkit.com/2015/07/does-not-work/)? –

+0

@Hadesあなたはテストケースとサンプル出力を提供しました。 – Enzokie

+0

@RobertColumbia私の目はもう働きません。 – shmosel

答えて

1

他の人が正しく考え出してきたあなたの問題は参照を比較するに根ざしていると...しかし、その問題を修正しても、ここソリューションは、効率的でも把握することは容易でもありません。

これを確認する簡単な方法があります。セットを使用して、リストの代わりに乱数の誕生日を保存するだけです。しかし、次の番号を追加する前にSet.contains()を使ってその番号がすでにセットに入っているかどうかを確認します。もしそうなら、あなたはマッチを見つけました...そして、あなたはすぐそこで止めることができます!

+0

私は知っています。もう一度、貧しいコーディングの選択肢を許してください。しかし、それが内側のループから壊れるとき、それは外側のループからも外れなければならない。 – Hades948

+0

はい私は根本的な原因を逃しました...しかし、私はそれを修正し、より良い解決策の提案を改善しました。 – GhostCat

2

根本的な問題は、この行です:

if ((birthdays.get(i) == birthdays.get(j))) { 

これはアイデンティティの平等のためのIntegerオブジェクトを比較しています。あなたがここで行う必要があるのは、価値の平等のための比較です:

if ((birthdays.get(i).equals(birthdays.get(j)))) { 

これは、50%をわずかに上回る正しい結果をもたらすはずです。

+0

はい、このコードを同様の変更でテストしましたが、結果は50%を超えています。私はポストしようとしていたが、あなたは速かった! –

+0

ああ、大丈夫です。本当にありがとう!これはしばらく私を狂ってしまった。私のロジックがまだうまくいて、私は狂っていないと知ってよかった!! :D – Hades948

関連する問題