BAEL-4405 Probability in Java

This commit is contained in:
mdabrowski-eu 2020-07-23 19:29:59 +02:00
parent 621301b713
commit 9c0eba409e
3 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,17 @@
package com.baeldung.probability;
import org.apache.commons.math3.distribution.NormalDistribution;
public class MaleHeightGenerator {
private static final double MEAN_HEIGHT = 176.02;
private static final double STANDARD_DEVIATION = 7.11;
private static NormalDistribution distribution = new NormalDistribution(MEAN_HEIGHT, STANDARD_DEVIATION);
public static double generateNormalHeight() {
return distribution.sample();
}
public static double probabilityOfHeightBetween(double heightLowerExclusive, double heightUpperInclusive) {
return distribution.probability(heightLowerExclusive, heightUpperInclusive);
}
}

View File

@ -0,0 +1,19 @@
package com.baeldung.probability;
import io.vavr.Lazy;
import java.util.SplittableRandom;
import java.util.function.Supplier;
public class RandomInvoker {
private final Lazy<SplittableRandom> random = Lazy.of(SplittableRandom::new);
public <T> T withProbability(Supplier<T> supplier1, Supplier<T> supplier2, int probability) {
SplittableRandom random = this.random.get();
if (random.nextInt(1, 101) <= probability) {
return supplier1.get();
} else {
return supplier2.get();
}
}
}

View File

@ -0,0 +1,24 @@
package com.baeldung.probability;
import org.assertj.core.data.Offset;
import org.junit.Test;
import java.util.stream.Stream;
import static org.assertj.core.api.Assertions.assertThat;
public class RandomInvokerUnitTest {
@Test
public void givenProbability_whenInvoked_invokeWithProbability() {
RandomInvoker randomInvoker = new RandomInvoker();
int numberOfSamples = 1_000_000;
int probability = 10;
int howManyTimesInvoked = Stream.generate(() -> randomInvoker.withProbability(() -> 1, () -> 0, probability))
.limit(numberOfSamples)
.mapToInt(e -> e).sum();
int monteCarloProbability = (howManyTimesInvoked * 100) / numberOfSamples;
assertThat(monteCarloProbability).isCloseTo(probability, Offset.offset(1));
}
}