Як випадковим чином вибрати елемент із масиву


Відповіді:


183
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}

2
так, але ви повинні сказати, що generatorце екземплярjava.util.Random
stivlo

25
Я б не створював Random()кожного разу, коли ви запускаєте функцію: генератор випадкових випадків повинен мати історію. Якщо цього не сталося, це надзвичайно передбачувано. У цьому випадку це зовсім не проблема, але слід зазначити, що array[(int)(System.currentTimeMillis() % array.length)]вона настільки ж гарна, як пропоноване рішення.
alf

5
@alf, це далеко не так добре, як пропоноване рішення. new Random()намагається створити екземпляр, який має інше насіння, ніж будь-яке раніше створене Random. Ваш підхід розірветься жахливо, лише двічі викликавши функцію за короткий час.
aioobe

1
@alf деякі системи не мають точного годинника до мілісекунди, що може виключити деякі варіанти, якщоgcd(array.length,clockAccuracy)!=1
храповий дивак

3
Я щойно помітив сповіщення про те, що я підтримав цю відповідь - мабуть, натиснув її випадково; на жаль, інтерфейс не дозволяє мені скасувати це (там сказано, що я не можу змінити свій голос, якщо відповідь не відредаговано ...). Отже, вибачення за Кріса Деннета.
Пітер Хенлі,

13

Ви можете використовувати генератор випадкових випадків, щоб створити випадковий індекс і повернути елемент за цим індексом:

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];

9

Якщо ви збираєтеся отримувати випадковий елемент кілька разів, ви хочете, щоб генератор випадкових чисел ініціалізувався лише один раз.

import java.util.Random;

public class RandArray {
    private int[] items = new int[]{1,2,3};

    private Random rand = new Random();

    public int getRandArrayElement(){
        return items[rand.nextInt(items.length)];
    }
}

Якщо ви вибираєте випадкові елементи масиву, які повинні бути непередбачуваними, вам слід використовувати java.security.SecureRandom, а не Random. Це гарантує, що якщо хтось знає кілька останніх виборів, вони не матимуть переваги в угадуванні наступного.

Якщо ви хочете вибрати випадкове число з масиву Object, використовуючи загальні засоби, ви можете визначити метод для цього (Source Avinash R у елементі Random з масиву рядків ):

import java.util.Random;

public class RandArray {
    private static Random rand = new Random();

    private static <T> T randomFrom(T... items) { 
         return items[rand.nextInt(items.length)]; 
    }
}

3

використовуйте java.util.Randomдля генерації випадкового числа від 0 до довжини масиву:, random_numberа потім використовуйте випадкове число, щоб отримати ціле число:array[random_number]


3

Використовуйте клас Random :

int getRandomNumber(int[] arr)
{
  return arr[(new Random()).nextInt(arr.length)];
}

2

Ви також можете використовувати

public static int getRandom(int[] array) {
    int rnd = (int)(Math.random()*array.length);
    return array[rnd];
}

Math.random()повертає doubleміж 0.0(включно) до 1.0(ексклюзивно)

Помноживши це на, array.lengthви отримаєте doubleміж 0.0(включно) та array.length(ексклюзивно)

Кастинг intокруглюється вниз, даючи вам і ціле число між 0(включно) та array.length-1(включно)


Math.random () повертає double, а не int. Якби це було б, було б лише два можливих значення 0 і 1.
Акшай Р.

1

Оскільки у вас Java 8, іншим рішенням є використання Stream API.

new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));

Де 1найнижчий генерований int (включно) та 500найвищий (ексклюзивний). limitозначає, що ваш потік матиме довжину 500.

 int[] list = new int[] {1,2,3,4,5,6};
 new Random().ints(0, list.length).limit(10).forEach(p -> System.out.println(list[p])); 

Випадковий - з java.utilупаковки.



0

Java має клас Random у пакеті java.util. З його допомогою ви можете зробити наступне:

Random rnd = new Random();
int randomNumberFromArray = array[rnd.nextInt(3)];

Сподіваюся, це допомагає!


0
package workouts;

import java.util.Random;

/**
 *
 * @author Muthu
 */
public class RandomGenerator {
    public static void main(String[] args) {
     for(int i=0;i<5;i++){
         rndFunc();
     } 
    }
     public static void rndFunc(){
           int[]a= new int[]{1,2,3};
           Random rnd= new Random();
           System.out.println(a[rnd.nextInt(a.length)]);
       }
}

0

Ви також можете спробувати такий підхід ..

public static <E> E[] pickRandom_(int n,E ...item) {
        List<E> copy = Arrays.asList(item);
        Collections.shuffle(copy);
        if (copy.size() > n) {
            return (E[]) copy.subList(0, n).toArray();
        } else {
            return (E[]) copy.toArray();
        }

    }

Отже, ви перетасовуєте список із O(nlogn)часовою складністю, робите його копію двічі, використовуючи загально в 3 рази більше пам'яті, ніж початковий масив, хоча проблема, про яку запитував ОП, може бути вирішена за допомогою O(1)складності часу та O(1)пам'яті ...?
Ярослав Павлак,

так, ти маєш рацію, це було краще робити з постійною складністю часу та простору.
Раві Сапарія,

0
package io.github.baijifeilong.tmp;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;

/**
 * Created by BaiJiFeiLong@gmail.com at 2019/1/3 下午7:34
 */
public class Bar {
    public static void main(String[] args) {
        Stream.generate(() -> null).limit(10).forEach($ -> {
            System.out.println(new String[]{"hello", "world"}[ThreadLocalRandom.current().nextInt(2)]);
        });
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.