Запустите метод в цикле, чтобы получить Max, Min из списка массивов

Фон: Имя метода - computeStatsMean (). Он берет начальное значение 100 и добавляет к нему недельную прибыль путем случайной выборки средней недельной прибыли из нормального распределения. Необходимо вычислить, во сколько превратится значение 100 за 3582 недели. Мне нужно провести 1000 испытаний этого метода, чтобы увидеть, как разные значения средней недельной прибыли от нормального распределения дают нам разные значения прибыли. Мне нужно сохранить доходность 1000 акций (значения прибыли или «новые значения») в ArrayList и получить от него максимум, минимум, медианное значение.

Проблема: Я могу запустить метод, сделать выборку и все такое. Но я не могу запустить его на 1000 испытаний. Я пробовал вызвать метод в основном 1000 раз (1000 для цикла), но он заменил старое значение новым в ArrayList.

Код:

class Sample extends SimulateMarket{ 

public ArrayList<Double> data = new ArrayList<Double>();
public ArrayList<Double> myData = new ArrayList<Double>();
private double mean, stdDev; 
private Random random;
private SimulateMarket mySim = new SimulateMarket(); //mySim is an instance of SimulateMarket class used to access variables of Simulate Class

//Constructor 
public Sample(){ //Constructor used for the Distributional Technique
    random = new Random();
    int size = 3582;
    for(int i=0; i<size ; i++) 
        data.add(0.0016+random.nextGaussian()*0.0205);      //Random sampling from Normal Distribution 
    System.out.println(this); //for printing the results
}

//Getters (Mean, Standard Deviation, Median)
public double getMean(){
    double sum=0;
    for(int i=0; i<mySim.WEEK; i++)
        sum += data.get(i);
    return sum/data.size();
}

public void computeStatsMean(){
    double equity = 100;
    for(int i=0; i<100; i++){ 
        equity = equity*(1+getMean());
    }
    myData.add(equity);
    System.out.println("mean : " + getMean());

    for(Double num: myData){
        System.out.println("with mean:" + num);
    }

}

class SimulateMarket{
    public static void main(String[] args){
        for(int i=0; i<1000; i++){ 
        Sample equity = new Sample();
        equity.computeStatsMean(); 

    }
}

}

Зачем вам mySim, если ваш класс расширяет SimulateMarket? Кроме того, ваш класс выполняет случайные действия в конструкторе, поэтому вам следует создать новый экземпляр, когда вы хотите получить новые результаты (или переделать свой код). В любом случае, в будущем вам также следует опубликовать свой файл main.

Roy Shahaf 13.09.2018 05:52

Как вы вызываете computeStatsMean () из main ()?

Gokul Nath KP 13.09.2018 05:56

Вы расширяете SimulaeMarket, вам не нужно создавать его экземпляр (подумайте о наследовании). Используйте, например, this.WEEK для доступа к участникам SimulateMarket. Вы можете удалить эту строку «private SimulateMarket mySim = ....»

nabster 13.09.2018 06:01

Кроме того, вы можете показать здесь свой main ()? Возможно, вы сбрасываете данные или myData при каждом экземпляре этого класса в main ()

nabster 13.09.2018 06:04

Я отредактировал код и добавил основной метод. @nabsATX, конечно, я сделаю это!

Shahbaz Malik 13.09.2018 06:11

@GokulNathKP Я отредактировал код и добавил основной метод выше.

Shahbaz Malik 13.09.2018 06:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
159
2

Ответы 2

Вы создаете новый экземпляр Sample каждый раз внутри for-loop в main().

Sample equity = new Sample();

Следовательно, при вызове equity.computeStatsMean(); старые значения теряются.

Попробуйте, как показано ниже:

Sample equity;
public static void main(String[] args) {
    equity = new Sample();
    for(int i = 0; i < 1000; i++) { 
        equity.computeStatsMean(); 
    }
}

В computeStatsMean() меняем:

equity = equity*(1+getMean());

к

equity = equity*(i+getMean());  // use i instead of 1

В computeStatsMean() начните значение счетчика с 1 вместо 0. (Надеюсь, вы сможете понять, почему!)

да. Вместо добавления в ArrayList в классе Sample сделайте computeStatsMean () для возврата значений и создайте ArrayList в вашем main () и добавьте значения.

Gokul Nath KP 13.09.2018 06:44

я разместил код выше. Это дает мне те же «1000 значений».

Shahbaz Malik 13.09.2018 07:04

Изменить эквити = эквити * (1 + getMean ()); к эквити = эквити * (я + getMean ());

Gokul Nath KP 13.09.2018 07:04

Сэр, на выходе получается "Бесконечность".

Shahbaz Malik 13.09.2018 07:07

Я поместил метод computeStatsMean () переименовал его в Distributional в класс SimulateMarket и использовал класс Sample для хранения значений. Теперь работает.

class SimulateMarket{ //Application Class (it contains the Main Method)

//public instance variables
public double meanWeekly = 0.0016;  //Average weekly return
public double median = 0.0029; //the middle value is known as Median 
public final int WEEK = 3582;  //Data calculate over the course of 3582 weeks 
public final int WEEK_YEAR = 52; //The number can never changes; hence, "final." 
//private instance variables
private double meanYearly = meanWeekly * WEEK_YEAR; //Formula for average yearly return
private double stdDev = 0.0205;

public double Distributional(){
    Sample mySampleA = new Sample();
    double equity = 100;
    for(int i=0; i<3582; i++){ 
        equity = equity*(1+mySampleA.getMean());
    }
    return equity;
}

public static void main(String[] args){

    Sample b = new Sample();
    b.computeStats();
}
}

class Sample{
public void computeStats(){
    for(int i=0; i<4; i++){
        myDataA.add(super.Distributional());
    }
    for(Double num: myDataA){
        System.out.println(num);
    }
    System.out.println(toStringA());
}

public String toStringA(){
    return String.format("\nDistrubution: size = %d, mean = %.2f, stdDev = %.2f, min = %.2f, max = %.2f, median = %.2f", myDataA.size(), getMeanA(), getStdDevA(mean), Collections.min(myDataA), Collections.max(myDataA), getMedianA()); 
}
}

Другие вопросы по теме