So wählen Sie ein Element zufällig aus einem Array aus

94

Ich suche nach einer Lösung, um Zahlen zufällig aus einem ganzzahligen Array auszuwählen.

Zum Beispiel habe ich ein Array new int[]{1,2,3}. Wie kann ich eine Zahl zufällig auswählen?

BreakHead
quelle
Refer This
Mithun Sasidharan

Antworten:

181
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}
Chris Dennett
quelle
2
Ja, aber Sie müssen sagen, dass dies generatoreine Instanz vonjava.util.Random
stivlo
25
Ich würde nicht Random()jedes Mal erstellen, wenn Sie die Funktion ausführen: Der Zufallsgenerator soll Verlauf haben. Wenn nicht, ist es extrem vorhersehbar. In diesem Fall ist das überhaupt kein Problem - aber es sollte erwähnt werden, dass dies array[(int)(System.currentTimeMillis() % array.length)]genauso gut ist wie die vorgeschlagene Lösung.
alf
4
@alf, das ist bei weitem nicht so gut wie die vorgeschlagene Lösung. new Random()versucht, eine Instanz zu erstellen, die einen anderen Startwert als alle zuvor erstellten hat Random. Ihr Ansatz würde schrecklich brechen, wenn Sie die Funktion in kurzer Zeit zweimal aufrufen.
Aioobe
1
@alf einige Systeme haben keine millisekundengenaue Uhr, was einige Optionen ausschließen kann, wenngcd(array.length,clockAccuracy)!=1
Ratschenfreak
3
Ich habe gerade eine Benachrichtigung bemerkt, dass ich diese Antwort abgelehnt habe - ich muss versehentlich darauf geklickt haben; Leider lässt mich die Benutzeroberfläche nicht rückgängig machen (es heißt, ich kann meine Stimme nur ändern, wenn die Antwort bearbeitet wird ...). Also entschuldige mich bei Chris Dennett.
Peter Hanley
13

Mit dem Zufallsgenerator können Sie einen Zufallsindex generieren und das Element an diesem Index zurückgeben:

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

Wenn Sie mehrmals ein zufälliges Element erhalten, möchten Sie sicherstellen, dass Ihr Zufallszahlengenerator nur einmal initialisiert wird.

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

Wenn Sie zufällige Array-Elemente auswählen , die unvorhersehbar sein müssen, sollten Sie java.security.SecureRandom anstelle von Random verwenden. Das stellt sicher, dass jemand, der die letzten paar Picks kennt, keinen Vorteil darin hat, die nächsten zu erraten.

Wenn Sie mithilfe von Generika eine Zufallszahl aus einem Object-Array auswählen möchten, können Sie hierfür eine Methode definieren (Source Avinash R im Random-Element aus dem 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)]; 
    }
}
Stephen Ostermiller
quelle
3

Verwenden Sie java.util.Randomdiese Option, um eine Zufallszahl zwischen 0 und Array-Länge zu generieren: random_numberund verwenden Sie dann die Zufallszahl, um die Ganzzahl zu erhalten:array[random_number]

James.Xu
quelle
3

Verwenden Sie die Zufallsklasse :

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

Sie können auch verwenden

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

Math.random()gibt ein doublezwischen 0.0(inklusive) bis 1.0(exklusiv) zurück

Wenn Sie dies mit multiplizieren, erhalten array.lengthSie doublezwischen 0.0(inklusive) und array.length(exklusiv)

Casting to intwird abrunden und gibt Ihnen eine ganze Zahl zwischen 0(inklusive) und array.length-1(inklusive)

Ratschenfreak
quelle
Math.random () gibt ein Double und kein Int zurück. Wenn es so gewesen wäre, hätte es nur zwei mögliche Werte 0 und 1 gegeben.
Akshay R.
1

Da Sie Java 8 haben, besteht eine andere Lösung darin, die Stream-API zu verwenden.

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

Wobei 1das niedrigste int (einschließlich) und 500das höchste (exklusiv) generiert wird. limitbedeutet, dass Ihr Stream eine Länge von 500 hat.

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

Zufall ist aus java.utilPaket.

Johnny Willer
quelle
0

Java hat eine Random-Klasse im Paket java.util. Mit ihm können Sie Folgendes tun:

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

Hoffe das hilft!

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

quelle
0

Sie können diesen Ansatz auch ausprobieren.

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
quelle
Sie mischen also eine Liste mit O(nlogn)zeitlicher Komplexität, erstellen die Kopie zweimal mit insgesamt dreimal so viel Speicher wie das ursprüngliche Array, obwohl das von OP angefragte Problem mit O(1)zeitlicher Komplexität und O(1)Speicher gelöst werden kann ...?
Jaroslaw Pawlak
Ja, Sie haben Recht. Es war besser, mit konstanter zeitlicher und räumlicher Komplexität zu tun.
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
quelle