Cara memilih elemen dari array secara acak


95

Saya mencari solusi untuk memilih nomor secara acak dari array integer.

Misalnya saya memiliki array new int[]{1,2,3}, bagaimana saya bisa memilih nomor secara acak?


Jawaban:


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

2
ya, tapi Anda harus tahu itu generatoradalah contoh darijava.util.Random
stivlo

26
Saya tidak akan membuat Random()setiap kali Anda menjalankan fungsi: generator acak seharusnya memiliki riwayat. Jika belum, itu sangat bisa diprediksi. Ini sama sekali bukan masalah dalam kasus ini - tetapi harus disebutkan bahwa array[(int)(System.currentTimeMillis() % array.length)]itu sebaik solusi yang diusulkan.
alf

6
@alf, itu masih jauh dari solusi yang diusulkan. new Random()mencoba membuat instance yang memiliki seed berbeda dari yang dibuat sebelumnya Random. Pendekatan Anda akan rusak parah hanya dengan menjalankan fungsi dua kali dalam waktu singkat.
aioobe

1
@alf beberapa sistem tidak memiliki jam akurat hingga milidetik yang mungkin menghalangi beberapa opsi jikagcd(array.length,clockAccuracy)!=1
ratchet freak

3
Saya baru saja melihat pemberitahuan bahwa saya tidak menyukai jawaban ini - saya pasti telah mengkliknya secara tidak sengaja; sayangnya antarmuka tidak mengizinkan saya membatalkannya (dikatakan saya tidak dapat mengubah pilihan saya kecuali jawabannya diedit ...). Jadi, mohon maaf kepada Chris Dennett.
Peter Hanley

13

Anda dapat menggunakan generator acak untuk menghasilkan indeks acak dan mengembalikan elemen pada indeks itu:

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

9

Jika Anda akan mendapatkan elemen acak beberapa kali, Anda ingin memastikan pembuat nomor acak Anda diinisialisasi hanya sekali.

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

Jika Anda memilih elemen larik acak yang tidak dapat diprediksi, Anda harus menggunakan java.security.SecureRandom daripada Random. Itu memastikan bahwa jika seseorang mengetahui beberapa pilihan terakhir, mereka tidak akan memiliki keuntungan dalam menebak pilihan berikutnya.

Jika Anda ingin memilih nomor acak dari array Objek menggunakan generik, Anda dapat menentukan metode untuk melakukannya (Sumber Avinash R dalam elemen acak dari array string ):

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

gunakan java.util.Randomuntuk menghasilkan nomor acak antara 0 dan panjang array:, random_numberlalu gunakan nomor acak untuk mendapatkan bilangan bulat:array[random_number]


3

Gunakan kelas Random :

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

2

Anda juga bisa menggunakan

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

Math.random()mengembalikan doubleantara 0.0(inklusif) ke 1.0(eksklusif)

Mengalikan ini dengan array.lengthmemberi Anda doubleantara 0.0(inklusif) dan array.length(eksklusif)

Mentransmisikan ke intakan membulatkan memberi Anda dan bilangan bulat antara 0(inklusif) dan array.length-1(inklusif)


Math.random () mengembalikan double dan bukan int. Jika memungkinkan, hanya akan ada dua kemungkinan nilai 0 dan 1.
Akshay R.

1

Karena Anda memiliki java 8, solusi lainnya adalah menggunakan API Stream.

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

Dimana 1int terendah yang dihasilkan (inklusif) dan 500merupakan yang tertinggi (eksklusif). limitberarti streaming Anda akan memiliki panjang 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])); 

Acak berasal dari java.utilpaket.



0

Java memiliki kelas Acak dalam paket java.util. Dengan menggunakannya, Anda dapat melakukan hal berikut:

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

Semoga ini membantu!


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

Anda juga dapat mencoba pendekatan ini ..

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

    }

Jadi Anda mengocok daftar dengan O(nlogn)kerumitan waktu, membuat salinannya dua kali menggunakan total memori 3 kali lebih banyak dari larik awal, meskipun masalah yang ditanyakan OP dapat diselesaikan dengan O(1)kerumitan waktu dan O(1)memori ...?
Jaroslaw Pawlak

ya, Anda benar, Lebih baik melakukannya dengan ruang dan waktu yang konstan.
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)]);
        });
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.