Если вам нужен постоянно точный список log(n)
уникальных номеров, почему бы не сгенерировать их в первую очередь?Вы можете заполнить массив позже.
import java.util.Random;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class RandomExample {
public static void main(String[] args) {
System.out.println(fillLogNUnique(100, 0, 100));
}
public static List <Integer> fillLogNUnique(final int n, final int lowLimit, final int highLimit) {
final Random random = ThreadLocalRandom.current();
// Assuming log base 2.0.
final int requiredUniqueCount = (int) Math.floor(Math.log(n) / Math.log(2.0));
final List <Integer> uniques = random
.ints(lowLimit, highLimit)
.limit(requiredUniqueCount)
.boxed()
.collect(Collectors.toList());
return IntStream
.range(0, n)
.map(x -> uniques.get(random.nextInt(uniques.size())))
.boxed()
.collect(Collectors.toList());
}
}
Входные данные: n
: количество требуемых случайных чисел, lowLimit
: нижние границы для сгенерированных чисел и highLimit
: верхняя граница.
Выход для этого:
[17, 29, 98, 17, 17, 29, 64, 64, 64, 17, 98, 98, 91, 17, 64, 50, 17, 50, 50, 64, 98, 91, 29, 50, 91, 50, 91, 98, 91, 98, 98, 29, 91, 91, 98, 64, 29, 98, 91, 50, 64, 50, 64, 17, 17, 50, 29, 29, 50, 50, 91, 50, 17, 17, 98, 64, 17, 98, 64, 17, 50, 17, 50, 50, 91, 50, 64, 91, 64, 91, 64, 64, 64, 91, 64, 64, 50, 50, 91, 50, 17, 17, 64, 98, 91, 17, 17, 17, 64, 50, 91, 29, 29, 91, 29, 50, 29, 91, 17, 91]
..., который имеет ровно 6, поскольку log(100)
с основанием 2 имеет целочисленное значение (с полами), равное 6.
Обратите внимание, что этот ответ для Java> = 8.