Jak losowo wybrać element z tablicy


Odpowiedzi:


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

2
tak, ale musisz powiedzieć, że generatorjest to przykładjava.util.Random
— stivlo

26
Nie tworzyłbym za Random()każdym razem, gdy uruchamiasz funkcję: generator losowy ma mieć historię. Jeśli tak się nie stało, jest to niezwykle przewidywalne. W tym przypadku nie stanowi to żadnego problemu - ale należy wspomnieć, że array[(int)(System.currentTimeMillis() % array.length)]jest tak samo dobre, jak proponowane rozwiązanie.
— alf

7
@alf, to jest dalekie od tak dobrego, jak proponowane rozwiązanie. new Random()próbuje utworzyć instancję, która ma inne ziarno niż jakiekolwiek poprzednio utworzone Random. Twoje podejście przerwałoby okropnie po prostu wywołanie funkcji dwukrotnie w krótkim czasie.
— aioobe

1
@alf niektóre systemy nie mają zegara z dokładnością co do milisekundy, co może wykluczać niektóre opcje, jeśligcd(array.length,clockAccuracy)!=1
— zapadający freak

3
Właśnie zauważyłem powiadomienie, że zgodziłem się na tę odpowiedź - chyba przypadkowo kliknąłem; niestety interfejs nie pozwala mi tego cofnąć (mówi, że nie mogę zmienić swojego głosu, dopóki odpowiedź nie zostanie zmieniona ...). Więc przepraszamy Chrisa Dennetta.
— Peter Hanley

13

Możesz użyć generatora Random, aby wygenerować losowy indeks i zwrócić element o tym indeksie:

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

9

Jeśli masz zamiar wielokrotnie otrzymywać losowy element, upewnij się, że generator liczb losowych został zainicjowany tylko raz.

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)];
    }
}

Jeśli wybierasz losowe elementy tablicy, które muszą być nieprzewidywalne, powinieneś użyć java.security.SecureRandom zamiast Random. To gwarantuje, że jeśli ktoś zna kilka ostatnich typów, nie będzie miał przewagi w odgadywaniu następnego.

Jeśli chcesz wybrać losową liczbę z tablicy Object przy użyciu typów ogólnych, możesz zdefiniować metodę, aby to zrobić (Source Avinash R in Random element from string array ):

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

użyj java.util.Randomdo wygenerowania liczby losowej z zakresu od 0 do długości tablicy:, random_numbera następnie użyj liczby losowej, aby uzyskać liczbę całkowitą:array[random_number]


3

Użyj klasy losowej :

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

2

Możesz także użyć

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

Math.random()zwraca wartość doublemiędzy 0.0(włącznie) do 1.0(wyłączność)

Pomnożenie tego przez array.lengthdaje wartość doublemiędzy 0.0(włącznie) i array.length(ekskluzywnie)

Rzutowanie na intzaokrągli w dół, dając ci i liczbę całkowitą między 0(włącznie) i array.length-1(włącznie)


Math.random () zwraca double, a nie int. Gdyby tak było, byłyby tylko dwie możliwe wartości 0 i 1.
— Akshay R.

1

Ponieważ masz java 8, innym rozwiązaniem jest użycie Stream API.

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

Gdzie 1jest najniższą wygenerowaną 500liczbą int (włącznie) i najwyższą (wyłączną). limitoznacza, że ​​Twój strumień będzie miał długość 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])); 

Losowo pochodzi z java.utilpaczki.



0

Możesz także wypróbować to podejście.

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();
        }

    }

Więc tasujesz listę ze O(nlogn)złożonością czasową, tworzysz jej kopię dwukrotnie, używając w sumie 3 razy więcej pamięci niż początkowa tablica, nawet jeśli problem, o który pytał OP, można rozwiązać za pomocą O(1)złożoności czasowej i O(1)pamięci ...?
— Jarosław Pawlak

tak, masz rację, lepiej było zrobić ze stałą złożonością czasu i przestrzeni.
— Ravi Sapariya

-1

Java ma klasę Random w pakiecie java.util. Za jego pomocą możesz wykonać następujące czynności:

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

Mam nadzieję że to pomoże!


-1
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)]);
       }
}

-1
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)]);
        });
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.