Comment choisir au hasard un élément dans un tableau

94

Je recherche une solution pour choisir un nombre au hasard dans un tableau d'entiers.

Par exemple, j'ai un tableau new int[]{1,2,3}, comment puis-je choisir un nombre au hasard?

BreakHead
la source
Référer ceci
Mithun Sasidharan

Réponses:

182
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}
Chris Dennett
la source
2
oui, mais vous devez dire que generatorc'est une instance dejava.util.Random
stivlo
25
Je ne créerais pas à Random()chaque fois que vous exécutez la fonction: le générateur aléatoire est censé avoir une histoire. Sinon, c'est extrêmement prévisible. Ce n'est pas du tout un problème dans ce cas - mais il faut mentionner que array[(int)(System.currentTimeMillis() % array.length)]c'est aussi bon que la solution proposée.
alf
5
@alf, c'est loin d'être aussi bon que la solution proposée. new Random()essaie de créer une instance dont la valeur de départ est différente de celle précédemment créée Random. Votre approche casserait horriblement simplement en invoquant la fonction deux fois en peu de temps.
aioobe
1
@alf certains systèmes n'ont pas d'horloge précise à la milliseconde, ce qui peut exclure certaines options sigcd(array.length,clockAccuracy)!=1
ratchet freak
3
Je viens de remarquer une notification indiquant que j'ai refusé cette réponse - j'ai dû cliquer dessus accidentellement; malheureusement, l'interface ne me laissera pas l'annuler (elle dit que je ne peux pas changer mon vote à moins que la réponse ne soit modifiée ...). Alors, excuses à Chris Dennett.
Peter Hanley
13

Vous pouvez utiliser le générateur Random pour générer un index aléatoire et renvoyer l'élément à cet index:

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Luchian Grigore
la source
9

Si vous allez recevoir un élément aléatoire plusieurs fois, vous voulez vous assurer que votre générateur de nombres aléatoires n'est initialisé qu'une seule fois.

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

Si vous choisissez des éléments de tableau aléatoires qui doivent être imprévisibles, vous devez utiliser java.security.SecureRandom plutôt que Random. Cela garantit que si quelqu'un connaît les derniers choix, il n'aura aucun avantage à deviner le suivant.

Si vous cherchez à choisir un nombre aléatoire dans un tableau Object à l'aide de génériques, vous pouvez définir une méthode pour le faire (Source Avinash R dans l' élément Random du tableau de chaînes ):

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)]; 
    }
}
Stephen Ostermiller
la source
3

utilisez java.util.Randompour générer un nombre aléatoire entre 0 et la longueur du tableau:, random_numberpuis utilisez le nombre aléatoire pour obtenir l'entier:array[random_number]

James.Xu
la source
3

Utilisez la classe Random :

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

Vous pouvez aussi utiliser

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

Math.random()renvoie un doubleentre 0.0(inclus) à 1.0(exclusif)

Multiplier cela par array.lengthvous donne un doubleentre 0.0(inclus) et array.length(exclusif)

La diffusion en intarrondi vers le bas vous donne un entier entre 0(inclus) et array.length-1(inclus)

monstre à cliquet
la source
Math.random () renvoie un double et non un int. Si c'était le cas, il n'y aurait eu que deux valeurs possibles 0 et 1.
Akshay R.
1

Puisque vous avez java 8, une autre solution consiste à utiliser l'API Stream.

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

1est le plus petit entier généré (inclus) et 500est le plus élevé (exclusif). limitsignifie que votre flux aura une longueur de 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])); 

L'aléatoire provient du java.utilpackage.

Johnny Willer
la source
0

Java a une classe Random dans le package java.util. En l'utilisant, vous pouvez effectuer les opérations suivantes:

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

J'espère que cela t'aides!

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

la source
0

Vous pouvez également essayer cette approche.

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

    }
Ravi Sapariya
la source
Donc, vous mélangez une liste avec la O(nlogn)complexité du temps, faites-en la copie deux fois en utilisant le total de 3 fois plus de mémoire que le tableau initial, même si le problème qu'OP a posé peut être résolu avec la O(1)complexité du temps et la O(1)mémoire ...?
Jaroslaw Pawlak
oui, vous avez raison, il valait mieux faire avec une complexité constante de temps et d'espace.
Ravi Sapariya
0
package io.github.baijifeilong.tmp;

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

/**
 * Created by [email protected] 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)]);
        });
    }
}
BaiJiFeiLong
la source