2017-05-08 8 views
1

私は、アメリカンフットボールの得点方法でスコアを得る可能性をすべて探る簡単なプログラムを作ろうとしています。ここで Javaマルチスレッド|すべての可能性を見つける

は動作し、スコアのためにすべてのpossiblitiesを返す私のコードです

for (int a = 0; (a * sf) <= score; a++) { 
     for (int b = 0; (b * fg) + (a * sf) <= score; b++) { 
      for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) { 
       for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) { 
        for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) { 
         if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) { 
          count++; 
          // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 
         } 
        } 
       } 
      } 
     } 
    } 

私はので、私はプログラムがはるかに速く、より大きな数字を扱うことができるように、複数のスレッドにスコアを分割することができ、それを作りたいです。

現在、私は4スレッドでテストしており、このループを使用しています。例えば

for (int a = min; (a * sf) <= max; a++) { 
     for (int b = min; (b * fg) + (a * sf) <= max; b++) { 
      for (int c = min; (c * td) + (b * fg) + (a * sf) <= max; c++) { 
       for (int d = min; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= max; d++) { 
        for (int e = min; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= max; e++) { 
         if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == max) { 
          main.inc(); 
          System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 

         } 
        } 
       } 
      } 
     } 
    } 

、スコアは500 スレッド1であった場合1-125、 スレッド2、126から250、 糸3、251から375、 スレッド4になるだろう、376 500

私はそれを適切に分割して右のmin-maxを与えましたが、それでも正しく動作しません。私は、それぞれのループが始まる場所で何かをしなければならないと信じていますが、わかりません。どんな助けでも大歓迎です。もっと説明が必要な場合は、私に教えてください

+0

うん...これは非常に簡単と思われます。 –

+1

@ MuratK。なぜあなたはそれを投稿し、何も示唆しないのですか? – brendan612

+0

あなたの質問にはスニペットだけでなく[mcve]が必要です。 – Gimby

答えて

1

外側のforループでのみmin/maxを実行できることを確かめてください。それはこのように動作するかどうかを参照してください:

for (int a = min; (a * sf) <= max; a++) { 
    for (int b = 0; (b * fg) + (a * sf) <= score; b++) { 
     for (int c = 0; (c * td) + (b * fg) + (a * sf) <= score; c++) { 
      for (int d = 0; (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; d++) { 
       for (int e = 0; (e * td2) + (d * tdE) + (c * td) + (b * fg) + (a * sf) <= score; e++) { 
        if ((((a) * sf) + ((b) * fg) + ((c) * td) + ((d) * tdE) + ((e) * td2)) == score) { 
         count++; 
         // System.out.println((a)+" Safties | "+(b)+" Field Goals | "+(c)+" TD | "+(d)+" TD w/ E | "+(e)+" TD w/ 2PC "); 
        } 
       } 
      } 
     } 
    } 
} 

最小/最大でそれを実行するには、各レベルのスコアを分割、ループのすべての5に適用され、あなたが1024年のスレッドが必要になります(4 * 4 * 4 * 4 * 4 = 1024)。スレッド1は、それぞれ5 forループのそれぞれに対して1-125,1-125,1-125,1-125,1-125を行います。スレッド2は、1-125,1-125,1-125,1-125,126-250となります。スレッド3は1-125,1-125,1-125,1-125,251-375などを行います。基本的に5桁のように、ベース4の数字は00000から33333に増えます。しかし、アルゴリズムがCPUおよび/またはI/Oバウンドなので、スレッド数を数を超えて増やすとパフォーマンスは向上しませんマシン上にあるCPUコア。私はあなたが意図したように外側のループだけを4分割することに固執します。

EDIT:ここで働い実装です:

public class ScoresTest implements Runnable { 

    public static final int SCORE = 500; 
    public static final int SF = 2; 
    public static final int FG = 3; 
    public static final int TD = 6; 
    public static final int TE = 7; 
    public static final int TD2 = 8; 

    int min; 
    int max; 

    public ScoresTest(int min, int max) { 
     this.min = min; 
     this.max = max; 
    } 

    @Override 
    public void run() { 
     for (int a=min/SF; a*SF <= max; a++) { 
      for (int b=0; a*SF + b*FG <= SCORE; b++) { 
       for (int c=0; a*SF + b*FG + c*TD <= SCORE; c++) { 
        for (int d=0; a*SF + b*FG + c*TD + d*TE <= SCORE; d++) { 
         for (int e=0; a*SF + b*FG + c*TD + d*TE + e*TD2 <= SCORE; d++) { 
          if (a*SF + b*FG + c*TD + d*TE + e*TD2 == SCORE) { 
           System.out.println("SF: " + a + ", FG: " + b + ", TD: " + c + ", TE: " + d + ", TD2: " + e); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    public static void main(String args[]) { 
     Thread thread1 = new Thread(new ScoresTest(0, 124)); 
     Thread thread2 = new Thread(new ScoresTest(126, 248)); 
     Thread thread3 = new Thread(new ScoresTest(250, 374)); 
     Thread thread4 = new Thread(new ScoresTest(376, 500)); 

     thread1.start(); 
     thread2.start(); 
     thread3.start(); 
     thread4.start(); 
    } 

} 
+0

@ Gabriel Vince - アルゴリズムは非常にCPUを集中しているか多分CPUの数を超えてスレッドの数を増やすあなたのマシン上でパフォーマンスを向上させる可能性は低いです。それで、あなたのマシンに1024コアを持つことになっていました。 –

関連する問題