2

人が 7 フィートの橋の途中からスタートするプログラムに問題があります。説明は次のとおりです。

長さ7フィートの橋の中央に誰かが立っています。彼らの歩幅はちょうど 1 フィートです。彼らは進む方向を制御することはできませんが、橋は非常に狭く、一歩ごとに前進または後退しかできません。

人が橋を出る前に何歩歩くかを計算するプログラムを書きなさい。プログラムでこのシミュレーションを 1000 回実行し、出力として実行されたステップの平均数と最大数を表示します。(ヒント: 0 または 1 の乱数を生成し、一方を前方に、他方を後方に等しくします)。これを 20 回行い、比較観察を行います。

これは私がこれまでに持っているものです:

import java.util.Random;
import java.util.Scanner;
import java.text.DecimalFormat;

public class prog214a
{
    public static void main(String[] args)
    {
        Random generator = new Random();
        System.out.println("1000 iterations");
        int runs = 0;
        int iter = 1000;
        double count = 7.0 / 2.0;
        int random;
        System.out.println("Run\tAvarage\tGreatest Number of Steps");
        // for(runs=1;runs<20; runs+=1)
        // {
        for (iter = 1000; iter > 1; iter -= 1)
        {
            double tries = 1;
            double avg = count / tries;
            random = generator.nextInt(2);
            if (random == 0)
            {
                count -= 1;
            }
            if (random == 1)
            {
                count += 1;
            }
            if (count <= 0 || count >= 7)
            {
                System.out.println("#" + runs + ":\t" + avg + "\t" + count);
                count = 0;
                runs += 1;
            }
            tries += 1;
        }
        // }
    }
}
4

1 に答える 1

3

あなたの問題の一部は、あなたがそれに近づいている方法です。コードは、実行中の抽象的なセットから実際の機械的実行までの適切なパスを示す必要があります。

最初の問題は、アルゴリズム、または発生させたい一連のイベントを確立することです。

Print out position
Decide direction
Move
Repeat n times

次に、これらの総ステップをコードに変換しましょう。これを行うには、それぞれにメソッドを作成します。

public void printPosition();
public int findDirectionVector();
public void updatePosition(int move);//move is a vector
public void runSimulation(int iterations);

コントロールメソッドを記入しましょう:

public void runSimulation(int iterations) {
   for (n = 0; n < iterations ; n++) {
       executeIteration();//simple! 
   }
}

private void executeIteration() {
  printPosition();
  updatePosition(findDirectionVector());
}

ご覧のとおり、各メソッドが 1 つのことだけを行うようにしています。また、特定のもの (Position など) を、渡している変数として処理しようとするのではなく、クラスのメンバー変数として残しています。ただし、これは変更であるため、初期化とクラス構造を見てみましょう。

public Simulation {
  private int position = 0;
  private int iterations = 0;//number of times the person moves before you stop!

  public Simulation(int iterations) {
    this.iterations = iterations;
  }

  public static void main(String[] args) {
    Simulation sim = new Simulation(1000);//Run with 1000 iterations
    sim.runSimulation();
  }

  //your other methods go here
}

これを 1000 回実行したい場合sim.runSimulation()は、for ループでラップするだけです。

非常に重要なチェック (男は橋を出たか?) と他のメソッドの実装を省きました。

于 2012-11-07T01:57:50.300 に答える