Почему эта переменная внутри цикла for не сбрасывается в начальное значение? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть этот программный код, который пытается создать нечто похожее на симуляцию Монте-Карло.По сути, игрок начинает с данной ставки в £ и ставит справедливые ставки в £ 1, пока не разорится или не достигнет цели.

Программный код работает, как и ожидалось, но у меня проблема с оператором "int cash = кол;"Я хотел бы знать, как переменная «наличные деньги» обновляется правильно с каждой итерацией.

Меня смущает, почему он не сбрасывается обратно к начальному значению "кола", которое является пользовательским вводом вне основного цикла for.Например, если цель равна 500, а ставка равна 100, почему наличные не всегда остаются равными 100, и если это так, как они достигнут цели 500?

public static void monteCarlo() {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter stake, goal, " + " and number of tries");
    int stake = input.nextInt();
    int goal = input.nextInt();
    int tries = input.nextInt();
    int wins = 0;
    // repeat experiment
    for (int i = 0; i < tries; i++) {
        // do one gambler's ruin experiment
        int cash = stake;
        while (cash > 0 && cash < goal) {
            // flip coin and update
            if (Math.random() < 0.5) cash++;
            else cash--;
        }

        if (cash >= goal) {
            wins++;
        }
    }

    System.out.println(wins + " wins of " + tries);
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Строка int cash = stake делает (пере) установит для денежной переменной всегда одинаковое начальное значение!

Если вы введете 5 испытаний и ставку 12, то

  1. наличные сбрасываются до 12.
  2. цикл while увеличивает / уменьшает денежные средства при каждом испытании
  3. пока цель не будет достигнута или денег больше не будет

Шаги от 1. до 3. будут вызваны снова 5 раз. Каждый из 5 раз будет начинаться с 12, но инструкции cash++ и cash-- будут изменять его до тех пор, пока он не достигнет конечного состояния.

Запуск подробного варианта, приведенного ниже, может помочь вам получить более ясное представление ...

package so20190412;

import java.util.Scanner;

public class MC {

    public static void main(String[] args) {
        try(Scanner input = new Scanner(System.in);) {
        System.out.println("Please enter stake, goal, " + " and number of tries");
        int stake = input.nextInt();
        int goal = input.nextInt();
        int tries = input.nextInt();

        monteCarlo(stake, goal, tries);

        }
    }



    public static void monteCarlo(final int stake, final int goal, final int tries) {

        System.out.println("Starting with a stake of " + stake);
        System.out.println("Goal is " + goal);
        System.out.println("Will try : " + tries + " times");

        int wins = 0;
        // repeat experiment
        for (int i = 0; i < tries; i++) {
            // do one gambler's ruin experiment

            System.out.println("### ITERATION " + (i+1));
            int cash = stake;

            System.out.println(cash);
            while (cash > 0 && cash < goal) {
                // flip coin and update
                if (Math.random() < 0.5) {
                    cash++;
                    System.out.println("WIN! get one more € - new cash is " + cash);
                }
                else {
                    cash--;
                System.out.println("LOST one € - new cash is " + cash);
            }
            }

            if (cash >= goal) {
                wins++;
                System.out.println("Cash is over goal - add a win!");
            }
            System.out.println("END OF ITERATION - stake : " + stake + " cash:" + cash + " wins:" + wins);
        }

        System.out.println(wins + " wins of " + tries);
    }

}

Надеюсь, это прояснит ситуацию!

0 голосов
/ 12 апреля 2019
 if (Math.random() < 0.5) cash++;

50% -й шанс увеличения cash здесь. В среднем значение cash практически не меняется.

Чтобы получить cash от 100 до 500, вам потребуется около 400 побед в игре с вероятностью выигрыша 50%.

Продолжайте запускать программу, и вам может повезти :)

...