Акции каждой из компаний должны обслуживать отдельный поток биржи, который раз в 30 секунд должен менять цену на акции случайным образом +-3 %
//Я что-то типа такого накрутила, еще мне нужно это сделать, чтобы он
//повторялся через каждые 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 шт):
Автор решения: Nowhere Man
→ Ссылка
Можно написать следующую функцию, использующую 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