BAEL-5678 - Creating Random Numbers With No Duplicates in Java (#12698)
* BAEL-5678 - Creating Random Numbers With No Duplicates in Java Ready for review. * BAEL-5678 - review * using `isEmpty()` for `hasNext()`; * using `assertEquals` instead of `assertTrue`;
This commit is contained in:
parent
14f14f5c00
commit
8ad8a38682
|
@ -0,0 +1,36 @@
|
||||||
|
package com.baeldung.uniquerng;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class BigUniqueRng implements Iterator<Integer> {
|
||||||
|
|
||||||
|
private Random random = new Random();
|
||||||
|
private Set<Integer> generated = new LinkedHashSet<>();
|
||||||
|
|
||||||
|
public BigUniqueRng(int size, int max) {
|
||||||
|
while (generated.size() < size) {
|
||||||
|
Integer next = random.nextInt(max);
|
||||||
|
generated.add(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer next() {
|
||||||
|
if (!hasNext())
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
|
||||||
|
Iterator<Integer> iterator = generated.iterator();
|
||||||
|
Integer next = iterator.next();
|
||||||
|
iterator.remove();
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return !generated.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.baeldung.uniquerng;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
public class UniqueRng implements Iterator<Integer> {
|
||||||
|
|
||||||
|
private int size;
|
||||||
|
private List<Integer> numbers = new ArrayList<>();
|
||||||
|
|
||||||
|
public UniqueRng(int size, boolean zeroBased) {
|
||||||
|
this.size = size;
|
||||||
|
int start = (zeroBased ? 0 : 1);
|
||||||
|
int limit = (zeroBased ? size - 1 : size);
|
||||||
|
|
||||||
|
for (int i = start; i <= limit; i++) {
|
||||||
|
numbers.add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
Collections.shuffle(numbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer next() {
|
||||||
|
if (!hasNext())
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
|
||||||
|
return numbers.remove(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return !numbers.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.baeldung.uniquerng;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class RngUtilsUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenNUniqueNumRequested_thenNUniqueNumConsumed() {
|
||||||
|
TreeSet<Integer> set = new TreeSet<>();
|
||||||
|
int n = 5;
|
||||||
|
UniqueRng rng = new UniqueRng(n, true);
|
||||||
|
|
||||||
|
while (rng.hasNext()) {
|
||||||
|
set.add(rng.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(n, set.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenYRange_whenNUniqueNumRequested_thenNUniqueNumConsumed() {
|
||||||
|
TreeSet<Integer> set = new TreeSet<>();
|
||||||
|
int n = 5;
|
||||||
|
int y = n * 10;
|
||||||
|
|
||||||
|
BigUniqueRng rng = new BigUniqueRng(n, y);
|
||||||
|
while (rng.hasNext()) {
|
||||||
|
set.add(rng.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(n, set.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenIntStreamSizeN_whenCollected_thenSetSizeN() {
|
||||||
|
int n = 5;
|
||||||
|
int from = -5;
|
||||||
|
int to = n * 2;
|
||||||
|
|
||||||
|
Random r = new Random();
|
||||||
|
Set<Integer> set = r.ints(from, to)
|
||||||
|
.distinct()
|
||||||
|
.limit(n)
|
||||||
|
.boxed()
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
|
assertEquals(n, set.size());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue