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.