Это больше, чем вы просили, но это косвенно связано и может помочь людям найти этот вопрос.
Когда вы хотите получить ArrayList
случайных целых чисел, вам часто просто нужны какие-то случайные числа, и они на самом деле нигде не нужны. В таком случае вы, скорее всего, можете обойтись только с Iterator<Integer>
, который возвращает поток случайных целых чисел, столько, сколько вам нужно. Это очень легко сделать с помощью библиотеки Guava (которая в настоящее время должна быть частью каждой кодовой базы Java).
Вы можете легко определить Iterator<Integer>
, который даст вам столько случайных чисел (или любой другой тип данных, который вы хотите), сколько вы просите:
public static final Iterator<Integer> RAND_INT_ITER =
new AbstractIterator<Integer>() {
@Override
protected Integer computeNext() {
return ThreadLocalRandom.current().nextInt();
}
};
Или, если вы хотите использовать метод Random.nextInt(int max)
:
public static Iterator<Integer> randIntIterator(final int max) {
return new AbstractIterator<Integer>() {
@Override
protected Integer computeNext() {
return ThreadLocalRandom.current().nextInt(max);
}
};
}
Нет проблем с вызовом этого метода, где бы он вам ни понадобился, поскольку он не хранит состояния, в котором вы не тратите время или пространство, не вычисляя что-либо, и сборщик мусора очистит его для вас, когда вы закончите. Мы используем ThreadLocalRandom
, чтобы гарантировать, что они поточнобезопасны, и избегать создания новых объектов Random
повсеместно (и потенциальных условий гонки данных, которые представляют, хотя новые версии Java довольно умны в этом). Вы также можете легко использовать существующий объект Random
, если в этом есть больше смысла.
Некоторые примеры:
// print random ints until we see one that's divisible by 100
while(true) {
int rnd = RAND_INT_ITER.next();
System.out.println(rnd);
if(rnd % 100 == 0) {
break;
}
}
// Get an iterator of exactly 10 random ints, [0,255)
Iterator<Integer> tenRandInts = Iterators.limit(randIntIterator(255), 10);
while(tenRandInts.hasNext()) {
System.out.println(tenRandInts.next());
}
// Note that the returned iterator above is still one-use, if you need to iterate
// Over the same numbers more than once, put them in a list first
// It's not a good idea to simply convert an Iterator into an Iterable, see:
// http://stackoverflow.com/a/14711323/113632
List<Integer> randIntLs = ImmutableList.copyOf(
Iterators.limit(randIntIterator(255), 10));
for(int rnd : randIntLs) {
System.out.println(rnd);
}
for(int rnd : randIntLs) {
System.out.println(rnd);
}
Использование этого шаблона для генерации случайных данных часто делает ваш код чище, проще и проще для чтения. Попробуйте:)