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:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatoradalah contoh darijava.util.Random
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.
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.
gcd(array.length,clockAccuracy)!=1
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];
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)];
}
}
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)
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.
Lihat pertanyaan ini:
Bagaimana cara menghasilkan bilangan bulat acak dalam kisaran tertentu di Jawa?
Anda akan ingin menghasilkan nomor acak dari 0 ke panjang bilangan bulat Anda - 1. Kemudian cukup dapatkan int Anda dari array Anda:
myArray[myRandomNumber];
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)]);
}
}
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();
}
}
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 ...?
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)]);
});
}
}