Answers:
public static int getRandom(int[] array) {
int rnd = new Random().nextInt(array.length);
return array[rnd];
}
generator是java.util.Random
Random()每次运行该函数时创建该函数:随机生成器应该具有历史记录。如果没有,那是非常可预测的。在这种情况下,这根本不是问题,但应该指出的array[(int)(System.currentTimeMillis() % array.length)]是,它与建议的解决方案一样好。
new Random()尝试创建一个实例,该实例的种子与先前创建的种子不同Random。仅在短时间内调用该函数两次,您的方法就会彻底崩溃。
gcd(array.length,clockAccuracy)!=1
如果要多次获得一个随机元素,则要确保随机数生成器仅初始化一次。
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)];
}
}
如果要选择需要不可预测的随机数组元素,则应使用java.security.SecureRandom而不是Random。这样可以确保如果有人知道最后几个选秀权,那么他们在猜测下一个选秀权上将不会有优势。
如果要使用泛型从对象数组中选择随机数,则可以定义一个方法(字符串数组中Random元素中的 Source Avinash R):
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)];
}
}
您也可以使用
public static int getRandom(int[] array) {
int rnd = (int)(Math.random()*array.length);
return array[rnd];
}
Math.random()返回double介于0.0(包含)到1.0(不含)之间
将此乘以可array.length得出double介于0.0(含)和array.length(不含)之间的信息
强制转换为int会舍入为您和之间0(包括)和array.length-1(包括)之间的整数
由于您具有Java 8,因此另一个解决方案是使用Stream API。
new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));
哪里1是生成的最低int(含),500是最高(不含)。limit表示您的信息流长度为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]));
随机来自java.util包装。
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)]);
}
}
您也可以尝试这种方法。
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)时间复杂性的列表进行混洗,即使使用OP询问的问题可以通过O(1)时间复杂性和O(1)内存来解决,也可以使用两倍于初始数组的三倍的内存来复制它的副本两次?
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)]);
});
}
}