利用Java提供的Random類。從List或Set中隨機取出一個元素,從Map中隨機獲取一個key或value。
因為Set沒有提供get(int index)方法,僅僅能先獲取一個隨機數后。利用一個計數器,對Set進行循環,當計數器等於隨機數時返回當前元素,對於Map的處理也類似。
不知有沒有更好的方法……
package com.xjj.util;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
/**
* 隨機數工具,單例模式
* @author XuJijun
*
*/
public class RandomUtils {
//private static Random random;
//雙重校驗鎖獲取一個Random單例
public static ThreadLocalRandom getRandom() {
return ThreadLocalRandom.current();
/*if(random==null){
synchronized (RandomUtils.class) {
if(random==null){
random =new Random();
}
}
}
return random;*/
}
/**
* 獲得一個[0,max)之間的隨機整數。
* @param max
* @return
*/
public static int getRandomInt(int max) {
return getRandom().nextInt(max);
}
/**
* 獲得一個[min, max]之間的隨機整數
* @param min
* @param max
* @return
*/
public static int getRandomInt(int min, int max) {
return getRandom().nextInt(max-min+1) + min;
}
/**
* 獲得一個[0,max)之間的長整數。
* @param max
* @return
*/
public static long getRandomLong(long max) {
return getRandom().nextLong(max);
}
/**
* 從數組中隨機獲取一個元素
* @param array
* @return
*/
public static <E> E getRandomElement(E[] array){
return array[getRandomInt(array.length)];
}
/**
* 從list中隨機取得一個元素
* @param list
* @return
*/
public static <E> E getRandomElement(List<E> list){
return list.get(getRandomInt(list.size()));
}
/**
* 從set中隨機取得一個元素
* @param set
* @return
*/
public static <E> E getRandomElement(Set<E> set){
int rn = getRandomInt(set.size());
int i = 0;
for (E e : set) {
if(i==rn){
return e;
}
i++;
}
return null;
}
/**
* 從map中隨機取得一個key
* @param map
* @return
*/
public static <K, V> K getRandomKeyFromMap(Map<K, V> map) {
int rn = getRandomInt(map.size());
int i = 0;
for (K key : map.keySet()) {
if(i==rn){
return key;
}
i++;
}
return null;
}
/**
* 從map中隨機取得一個value
* @param map
* @return
*/
public static <K, V> V getRandomValueFromMap(Map<K, V> map) {
int rn = getRandomInt(map.size());
int i = 0;
for (V value : map.values()) {
if(i==rn){
return value;
}
i++;
}
return null;
}
/**
* 生成一個n位的隨機數,用於驗證碼等
* @param n
* @return
*/
public static String getRandNumber(int n) {
String rn = "";
if (n > 0 && n < 10) {
//Random r = new Random();
StringBuffer str = new StringBuffer();
for (int i = 0; i < n; i++) {
str.append('9');
}
int num = Integer.parseInt(str.toString());
while (rn.length() < n) {
rn = String.valueOf(ThreadLocalRandom.current().nextInt(num));
}
} else {
rn = "0";
}
return rn;
}
public static void main(String[] args) {
/*Set<String> set = new HashSet<>();
for (int i = 0; i < 12; i++) {
set.add("I am: " + i);
}
for (int i = 0; i < 10; i++) {
System.out.println(getRandomElement(set));
}*/
System.out.println(getRandom().nextInt(-100, 10));
}
}
