Câu trả lời:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generatorlà một ví dụ củajava.util.Random
Random()mỗi khi bạn chạy hàm: trình tạo ngẫu nhiên phải có lịch sử. Nếu không, nó cực kỳ dễ đoán. Nó hoàn toàn không phải là một vấn đề trong trường hợp này - nhưng cần đề cập rằng array[(int)(System.currentTimeMillis() % array.length)]nó cũng tốt như giải pháp được đề xuất.
new Random()cố gắng tạo một cá thể có hạt giống khác với bất kỳ cá thể nào đã tạo trước đó Random. Cách tiếp cận của bạn sẽ phá vỡ một cách khủng khiếp chỉ bằng cách gọi hàm hai lần trong thời gian ngắn.
gcd(array.length,clockAccuracy)!=1
Bạn có thể sử dụng Trình tạo ngẫu nhiên để tạo chỉ mục ngẫu nhiên và trả về phần tử tại chỉ mục đó:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Nếu bạn định nhận một phần tử ngẫu nhiên nhiều lần, bạn muốn đảm bảo rằng trình tạo số ngẫu nhiên của bạn chỉ được khởi tạo một lần.
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)];
}
}
Nếu bạn đang chọn các phần tử mảng ngẫu nhiên cần không thể đoán trước, bạn nên sử dụng java.security.SecureRandom thay vì Ngẫu nhiên. Điều đó đảm bảo rằng nếu ai đó biết vài lần chọn cuối cùng, họ sẽ không có lợi thế trong việc đoán lựa chọn tiếp theo.
Nếu bạn đang muốn chọn một số ngẫu nhiên từ một mảng Đối tượng bằng cách sử dụng số liệu chung, bạn có thể xác định một phương pháp để làm như vậy (Nguồn Avinash R trong Phần tử ngẫu nhiên từ mảng chuỗi ):
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)];
}
}
Sử dụng lớp Ngẫu nhiên :
int getRandomNumber(int[] arr)
{
return arr[(new Random()).nextInt(arr.length)];
}
Bạn cũng có thể dùng
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()trả về giá trị doublegiữa 0.0(bao gồm) đến 1.0(độc quyền)
Nhân giá trị này với array.lengthsẽ cho bạn một giá trị doublegiữa 0.0(bao gồm) và array.length(độc quyền)
Truyền tới intsẽ làm tròn xuống cung cấp cho bạn và số nguyên giữa 0(bao gồm) và array.length-1(bao gồm)
Vì bạn có java 8, một giải pháp khác là sử dụng Stream API.
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
Trong đó 1int thấp nhất được tạo (bao gồm) và 500là cao nhất (độc quyền). limitnghĩa là luồng của bạn sẽ có độ dài là 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]));
Ngẫu nhiên là từ java.utilgói.
Hãy xem câu hỏi này:
Làm cách nào để tạo số nguyên ngẫu nhiên trong một phạm vi cụ thể trong Java?
Bạn sẽ muốn tạo một số ngẫu nhiên từ 0 đến độ dài số nguyên của bạn - 1. Sau đó, chỉ cần lấy int từ mảng của bạn:
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)]);
}
}
Bạn cũng có thể thử cách tiếp cận này ..
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)độ phức tạp về thời gian, tạo bản sao của nó hai lần bằng cách sử dụng tổng bộ nhớ gấp 3 lần mảng ban đầu, mặc dù vấn đề mà OP hỏi có thể được giải quyết với O(1)độ phức tạp về thời gian và O(1)bộ nhớ ...?
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)]);
});
}
}