Акции каждой из компаний должны обслуживать отдельный поток биржи, который раз в 30 секунд должен менять цену на акции случайным образом +-3 %

Рейтинг: -3Ответов: 1Опубликовано: 13.02.2023
//Я что-то типа такого накрутила, еще мне нужно это сделать, чтобы он 
//повторялся через каждые 30 мин.
  
    import java.time.LocalTime;
        import java.util.ArrayList;
        import java.util.Optional;
        import java.util.Random;
        
        public class Change {
            public static final Object LOCK = new Object();
            
                public static void changePrice() {
                ArrayList<Integer> AL = new ArrayList<Integer>();
                int number;
                Random rnd = new Random();
        
                for (int i = 0; i < 1; i++) {
                    number = rnd.nextInt() % 50;
                    AL.add(number);
                }
               try {
                   synchronized (LOCK){
                       LOCK.wait(300);
                       Optional<Integer> sum = AL.stream()
                               .map(x -> x + 140)
                               .reduce(Integer::sum);
                       System.out.println(LocalTime.now() + ":" + "AAPL changed the price to:" + sum.get() );}
               }catch (InterruptedException a){
                   a.printStackTrace();
               }
               try {
                   synchronized (LOCK) {
                       LOCK.wait(300);
                       Optional<Integer> sum2 = AL.stream()
                               .map(x -> x + 387)
                               .reduce(Integer::sum);
                       System.out.println(LocalTime.now() + ":" + "COkE changed the price to:" + sum2.get());}
               }catch (InterruptedException b) {
                   b.printStackTrace();
               }
                   try {
                       synchronized (LOCK) {
                           LOCK.wait(300);
                           Optional<Integer> sum3 = AL.stream()
                                   .map(x -> x + 387)
                                   .reduce(Integer::sum);
                           System.out.println(LocalTime.now() + ":" + "IBM changed the price to:" + sum3.get());
                       }
                   } catch (InterruptedException d) {
                       d.printStackTrace();
               }
            }
        
            public static void main(String[] args) {
                changePrice();
        
            }
        
        
            }

Ответы

▲ 1Принят

Можно написать следующую функцию, использующую Random::nextInt для генерации целочисленного приращения в процентах от [-p, p]:

public static double plusMinusInt(double n, int percent) {
    int p = ThreadLocalRandom.current().nextInt(2 * percent + 1) - percent;
    System.out.println("\tchange = " + p + "% for n=" + n); // для отладки
    return n * (100.0 + p) / 100.0;
}

Тест:

double n = 100;
for (int i = 0; i < 5; i++) {
    System.out.println(i + ": " + n);
    n = plusMinusInt(n, 3);
}
0: 100.0
    change = -2% for n=100.0
1: 98.0
    change = -3% for n=98.0
2: 95.06
    change = -1% for n=95.06
3: 94.10940000000001
    change = -2% for n=94.10940000000001
4: 92.227212
    change = 1% for n=92.227212

Если нужно получить число процентов с плавающей запятой, следует воспользоваться Random::nextDouble / Math.random() и откорректировать значение, чтобы оно попало в диапазон:

public static double plusMinus(double n, int percent) {
    double p = ThreadLocalRandom.current().nextDouble() * (2 * percent) - percent;
    System.out.println("\tchange = " + p + "% for n=" + n);
    return n * (100.0 + p) / 100.0;
}

результаты теста:

0: 100.0
    change = 0.49646398098527644% for n=100.0
1: 100.49646398098528
    change = -1.9225702271092773% for n=100.49646398098528
2: 98.56434888518926
    change = -0.3543755465583147% for n=98.56434888518926
3: 98.21506093511573
    change = -2.8539047287242503% for n=98.21506093511573
4: 95.41209666676906
    change = 2.764012009853051% for n=95.41209666676906