Come scegliere a caso un elemento da un array


94

Sto cercando una soluzione per scegliere il numero in modo casuale da un array di numeri interi.

Ad esempio, ho un array new int[]{1,2,3}, come posso scegliere un numero a caso?


Risposte:


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

2
sì, ma devi dire che generatorè un esempio dijava.util.Random
stivlo

25
Non creerei Random()ogni volta che esegui la funzione: il generatore casuale dovrebbe avere una cronologia. In caso contrario, è estremamente prevedibile. Non è affatto un problema in questo caso, ma va detto che array[(int)(System.currentTimeMillis() % array.length)]è buono quanto la soluzione proposta.
alf

4
@alf, questo è tutt'altro che buono come la soluzione proposta. new Random()cerca di creare un'istanza che abbia un seme diverso da qualsiasi altra creata in precedenza Random. Il tuo approccio si interromperà orribilmente solo invocando la funzione due volte in breve tempo.
aioobe

1
@alf alcuni sistemi non hanno un orologio preciso al millisecondo, il che potrebbe precludere alcune opzioni segcd(array.length,clockAccuracy)!=1
ratchet freak

3
Ho appena notato una notifica che indicava di aver svalutato questa risposta: devo averla cliccata accidentalmente; sfortunatamente l'interfaccia non mi permette di annullarlo (dice che non posso cambiare il mio voto a meno che la risposta non venga modificata ...). Quindi, mi scuso con Chris Dennett.
Peter Hanley

13

Puoi utilizzare il generatore casuale per generare un indice casuale e restituire l'elemento a quell'indice:

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

9

Se stai per ottenere un elemento casuale più volte, assicurati che il tuo generatore di numeri casuali sia inizializzato solo una volta.

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

Se stai scegliendo elementi di array casuali che devono essere imprevedibili, dovresti usare java.security.SecureRandom piuttosto che Random. Ciò garantisce che se qualcuno conosce le ultime scelte, non avrà alcun vantaggio nell'indovinare il prossimo.

Se stai cercando di scegliere un numero casuale da un array di oggetti utilizzando generici, puoi definire un metodo per farlo (Fonte 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

utilizzare java.util.Randomper generare un numero casuale compreso tra 0 e la lunghezza dell'array:, random_numberquindi utilizzare il numero casuale per ottenere il numero intero:array[random_number]


3

Usa la classe Random :

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

2

Puoi anche usare

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

Math.random()restituisce un doubletra 0.0(compreso) e 1.0(esclusivo)

Moltiplicando questo valore per si array.lengthottiene un valore doublecompreso tra 0.0(inclusivo) e array.length(esclusivo)

Il cast a intverrà arrotondato per difetto fornendo un numero intero compreso tra 0(incluso) e array.length-1(incluso)


Math.random () restituisce un double e non un int. Se ci fossero stati solo due possibili valori 0 e 1.
Akshay R.

1

Dato che hai java 8, un'altra soluzione è usare l'API Stream.

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

Dove 1è il più basso int generato (incluso) ed 500è il più alto (esclusivo). limitsignifica che il tuo stream avrà una lunghezza di 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])); 

Random proviene dal java.utilpacchetto.



0

Java ha una classe Random nel pacchetto java.util. Usandolo puoi fare quanto segue:

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

Spero che questo ti aiuti!


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

Puoi anche provare questo approccio ..

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

    }

Quindi mescoli un elenco con la O(nlogn)complessità temporale, ne fai la copia due volte utilizzando il totale di 3 volte più memoria dell'array iniziale, anche se il problema che OP ha chiesto può essere risolto con la O(1)complessità temporale e la O(1)memoria ...?
Jaroslaw Pawlak

sì, hai ragione, era meglio avere a che fare con una complessità temporale e spaziale costante.
Ravi Sapariya

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)]);
        });
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.