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


Відповіді:


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.