/* * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/** * @test * @run testng RandomTest * @summary test methods on Random * @bug 8288596 * @key randomness
*/
@Test publicclass RandomTest {
// Note: this test was adapted from the 166 TCK ThreadLocalRandomTest test // and modified to be a TestNG test
/* * Testing coverage notes: * * We don't test randomness properties, but only that repeated * calls, up to NCALLS tries, produce at least one different * result. For bounded versions, we sample various intervals * across multiples of primes.
*/
// max numbers of calls to detect getting stuck on one value staticfinalint NCALLS = 10000;
// max sampled int bound staticfinalint MAX_INT_BOUND = (1 << 28);
// max sampled long bound staticfinallong MAX_LONG_BOUND = (1L << 42);
// Number of replications for other checks staticfinalint REPS = 20;
/** * Repeated calls to nextInt produce at least two distinct results
*/ publicvoid testNextInt() {
Random r = new Random(); int f = r.nextInt(); int i = 0; while (i < NCALLS && r.nextInt() == f)
++i;
assertTrue(i < NCALLS);
}
/** * Repeated calls to nextLong produce at least two distinct results
*/ publicvoid testNextLong() {
Random r = new Random(); long f = r.nextLong(); int i = 0; while (i < NCALLS && r.nextLong() == f)
++i;
assertTrue(i < NCALLS);
}
/** * Repeated calls to nextBoolean produce at least two distinct results
*/ publicvoid testNextBoolean() {
Random r = new Random(); boolean f = r.nextBoolean(); int i = 0; while (i < NCALLS && r.nextBoolean() == f)
++i;
assertTrue(i < NCALLS);
}
/** * Repeated calls to nextFloat produce at least two distinct results
*/ publicvoid testNextFloat() {
Random r = new Random(); float f = r.nextFloat(); int i = 0; while (i < NCALLS && r.nextFloat() == f)
++i;
assertTrue(i < NCALLS);
}
/** * Repeated calls to nextDouble produce at least two distinct results
*/ publicvoid testNextDouble() {
Random r = new Random(); double f = r.nextDouble(); int i = 0; while (i < NCALLS && r.nextDouble() == f)
++i;
assertTrue(i < NCALLS);
}
/** * Repeated calls to nextGaussian produce at least two distinct results
*/ publicvoid testNextGaussian() {
Random r = new Random(); double f = r.nextGaussian(); int i = 0; while (i < NCALLS && r.nextGaussian() == f)
++i;
assertTrue(i < NCALLS);
}
/** * nextInt(negative) throws IllegalArgumentException
*/
@Test(expectedExceptions = IllegalArgumentException.class) publicvoid testNextIntBoundedNeg() {
Random r = new Random(); int f = r.nextInt(-17);
}
/** * nextInt(bound) returns 0 <= value < bound; repeated calls produce at * least two distinct results
*/ publicvoid testNextIntBounded() {
Random r = new Random(); // sample bound space across prime number increments for (int bound = 2; bound < MAX_INT_BOUND; bound += 524959) { int f = r.nextInt(bound);
assertTrue(0 <= f && f < bound); int i = 0; int j; while (i < NCALLS &&
(j = r.nextInt(bound)) == f) {
assertTrue(0 <= j && j < bound);
++i;
}
assertTrue(i < NCALLS);
}
}
/** * A sequential sized stream of ints generates the given number of values
*/ publicvoid testIntsCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 0; for (int reps = 0; reps < REPS; ++reps) {
counter.reset();
r.ints(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
size += 524959;
}
}
/** * A sequential sized stream of longs generates the given number of values
*/ publicvoid testLongsCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 0; for (int reps = 0; reps < REPS; ++reps) {
counter.reset();
r.longs(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
size += 524959;
}
}
/** * A sequential sized stream of doubles generates the given number of values
*/ publicvoid testDoublesCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 0; for (int reps = 0; reps < REPS; ++reps) {
counter.reset();
r.doubles(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
size += 524959;
}
}
/** * Each of a sequential sized stream of bounded ints is within bounds
*/ publicvoid testBoundedInts() {
AtomicInteger fails = new AtomicInteger(0);
Random r = new Random(); long size = 12345L; for (int least = -15485867; least < MAX_INT_BOUND; least += 524959) { for (int bound = least + 2; bound > least && bound < MAX_INT_BOUND; bound += 67867967) { finalint lo = least, hi = bound;
r.ints(size, lo, hi).
forEach(x -> { if (x < lo || x >= hi)
fails.getAndIncrement();
});
}
}
assertEquals(fails.get(), 0);
}
/** * Each of a sequential sized stream of bounded longs is within bounds
*/ publicvoid testBoundedLongs() {
AtomicInteger fails = new AtomicInteger(0);
Random r = new Random(); long size = 123L; for (long least = -86028121; least < MAX_LONG_BOUND; least += 1982451653L) { for (long bound = least + 2; bound > least && bound < MAX_LONG_BOUND; bound += Math.abs(bound * 7919)) { finallong lo = least, hi = bound;
r.longs(size, lo, hi).
forEach(x -> { if (x < lo || x >= hi)
fails.getAndIncrement();
});
}
}
assertEquals(fails.get(), 0);
}
/** * Each of a sequential sized stream of bounded doubles is within bounds
*/ publicvoid testBoundedDoubles() {
AtomicInteger fails = new AtomicInteger(0);
Random r = new Random(); long size = 456; for (double least = 0.00011; least < 1.0e20; least *= 9) { for (double bound = least * 1.0011; bound < 1.0e20; bound *= 17) { finaldouble lo = least, hi = bound;
r.doubles(size, lo, hi).
forEach(x -> { if (x < lo || x >= hi)
fails.getAndIncrement();
});
}
}
assertEquals(fails.get(), 0);
}
/** * A parallel unsized stream of ints generates at least 100 values
*/ publicvoid testUnsizedIntsCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.ints().limit(size).parallel().forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * A parallel unsized stream of longs generates at least 100 values
*/ publicvoid testUnsizedLongsCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.longs().limit(size).parallel().forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * A parallel unsized stream of doubles generates at least 100 values
*/ publicvoid testUnsizedDoublesCount() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.doubles().limit(size).parallel().forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * A sequential unsized stream of ints generates at least 100 values
*/ publicvoid testUnsizedIntsCountSeq() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.ints().limit(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * A sequential unsized stream of longs generates at least 100 values
*/ publicvoid testUnsizedLongsCountSeq() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.longs().limit(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * A sequential unsized stream of doubles generates at least 100 values
*/ publicvoid testUnsizedDoublesCountSeq() {
LongAdder counter = new LongAdder();
Random r = new Random(); long size = 100;
r.doubles().limit(size).forEach(x -> {
counter.increment();
});
assertEquals(counter.sum(), size);
}
/** * Test shuffling a list with Random.from()
*/ publicvoid testShufflingList() { finalvar listTest = new ArrayList<Integer>(); final RandomGenerator randomGenerator = RandomGenerator.getDefault(); final Random random = Random.from(randomGenerator);
for (int i = 0; i < 100; i++) {
listTest.add(i * 2);
} finalvar listCopy = new ArrayList<Integer>(listTest);
Collections.shuffle(listCopy, random);
assertFalse(listCopy.equals(listTest));
}
/** * Test if Random.from returns this
*/ publicvoid testRandomFromInstance() { final RandomGenerator randomGenerator = RandomGenerator.getDefault();
final Random randomInstance = Random.from(randomGenerator);
// we wrap the same instance again final Random randomInstanceCopy = Random.from(randomInstance);
/* * Test whether calls to methods inherited from RandomGenerator * are delegated to the instance returned by from(). * This is not a complete coverage, but simulates the reproducer * in issue JDK-8288596
*/ publicvoid testRandomFrom() {
delegationCount = 0; var r = Random.from(new RandomGen());
r.isDeprecated();
r.nextFloat(1_000.0f);
r.nextFloat(); // not implemented in RandomGen, does not count
r.nextDouble(1_000.0);
r.nextDouble(); // not implemented in RandomGen, does not count
assertEquals(delegationCount, 3);
}
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.33 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.