package inventory;

/**
 *  Симуляция торговли со случайным спросом несохраняемого товара.
 * 
 * Created 2022-03-11 14:20:19
 * @author Alexander Mikhailovich Kovshov
 */
public class RandomDemand {
    static int[] h ;
    static boolean integer = !true;
    
    public static void main(String[] args) {
        System.out.println("Hello!");
        double x;           // дневной запас товара
        double p = 50;      // отпускная цена
        double q = 30;      // закупочная цена
        double r = 10;      // остаточная цена
        double a = 2;       // наименьшай спрос
        double b = 6;       // наибольший спрос
        int n = 10000000;   // число испытаний в численном опыте
        if (integer) h = new int[(int)b - (int)a + 1];
        for (x = a; x <= b; x += 1) {
            process(x, p, q, r, a, b, n);
        } 
        if (integer){
            x = (p * (b + .5) - q * (b - a + 1) - r * (a - .5)) / (p - r);
        } else {
            x = (q * a + p * b - q * b - r * a) / (p - r);
        }
        System.out.println("максимум при х: " + x);
        if (integer){
            for (int i = 0; i < h.length; i++) {
                System.out.println(h[i]);
            }
        } else {
            process(x, p, q, r, a, b, n);
        }
    }

    /**
     * Симуляция торговли со случайным спросом несохраняемого товара.
     * @param xдневной заказ.
     * @param pотпускная цена
     * @param qзакупочная цена
     * @param rостаточная цена
     * @param aнаименьшай спрос
     * @param bнаибольший спрос
     * @param n - число испытаний в численном опыте.
     */
    public static void process(double x, double p, double q, double r, double a, double b, int n) {
        double profit = 0;
        
        for (int i = 0; i < n; i++) {
            double y = Math.random() * (b - a);
            if (integer) { y = Math.floor(y * (b - a + 1) / (b - a));      h[(int)y]++; }
            y += a;
            profit += -q * x;
            if (y < x) {
                profit += p * y;
                profit += r * (x - y);
            } else {
                profit += p * x;
            }
        }
        profit /= n;
        double h; 
        if (integer) {
        h = ((x * p - x * q) * (b - x + 1) 
                + (p *(a + x - 1)/2 - x * q + r * (x - (a + x - 1) / 2)) * (x - a)) / (b - a + 1);
        } else {
         h = ((p * (x + a) / 2 - q * x + r * x - r * (x + a) / 2) * (x - a) 
                 + (p * x - q * x) * (b - x)) / (b - a); 
        }
            
        System.out.println("x: " + x + ";  среднедневная прибыль: " + profit + ";  по формуле: " + h);
        
    }
}