62,614
社区成员
发帖
与我相关
我的任务
分享
//获得不重复的随机数数组,取值范围[min,max),个数size
public static int[] getRandomIntWithoutReduplicate( int min, int max, int size )
{
int[] result = new int[size];//用于存储结果的数组
int arraySize = max - min;//用于放"牌"的数组大小
int[] intArray = new int[arraySize];//用于放"牌"的数组
// 初始化"牌盒",比如取值范围是[3,10)则"牌盒"里放的"牌"就是3,4,5,6,7,8,9
for( int i = 0 ; i < intArray.length ; i++ )
{
intArray[i] = i + min;
}
// 获取不重复的随机数数组
for( int i = 0 ; i < size ; i++ )
{
int c = getRandomInt( min, max - i );//获取到一个随机数
int index = c - min;//这个随机数在"牌盒"里的位置
swap( intArray, index, arraySize - 1 - i );//将这张"牌"放到"牌盒"的最后面
result[i] = intArray[ arraySize - 1 - i ];//把这张"牌"的值扔到存储结果的数组里
}
return result;
}
//获取随机数,随机数取值范围为[min, max)
public static int getRandomInt( int min, int max )
{
// include min, exclude max
int result = min + new Double( Math.random() * ( max - min ) ).intValue();
return result;
}
private static void swap( int[] array, int x, int y )
{//交换数组arry, 序号x与序号y值的顺序
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}
private static Random random = new Random();
public static int[] getRandomIntWithoutReduplicate2( int min, int max, int size )
{
int[] result = new int[size];
List<Integer> list = new ArrayList< Integer >();
//init list
for( int i = min; i < max; i++ )
{
list.add( i );
}
for( int i = 0; i < size; i++ )
{
int index = random.nextInt( list.size() );
result[i] = list.get( index );
list.remove( index );
}
return result;
}
if (len == 1) return new int[] {min};
import java.util.Arrays;
import java.util.Random;
/**
* <code>RandomUtil</code> - Random Tool Class.
* @author SageZk
* @version 1.0
*/
public class RandomUtil {
private RandomUtil() {}
private static Random rnd = null;
/**
* 初始化随机数发生器。
*/
private static void initRnd() {
if (rnd == null) rnd = new Random();
}
/**
* 计算并返回无重复值的以 <code>min</code> 为下限 <code>max</code> 为上限的随机整数数组。
* @param min 随机整数下限(包含)
* @param max 随机整数上限(包含)
* @param len 结果数组长度
* @return 结果数组
*/
public static int[] getLotteryArray(int min, int max, int len) {
//参数校验及性能优化
if (len < 0) return null; //长度小于 0 的数组不存在
if (len == 0) return new int[0]; //返回长度为 0 的数组
if (min > max) { //校正参数 min max
int t = min;
min = max;
max = t;
}
final int LEN = max - min + 1; //种子个数
if (len > LEN) return null; //如果出现 35 选 36 的情况就返回 null
//计算无重复值随机数组
initRnd(); //初始化随机数发生器
int[] seed = new int[LEN]; //种子数组
for (int i = 0, n = min; i < LEN;) seed[i++] = n++; //初始化种子数组
for (int i = 0, j = 0, t = 0; i < len; ++i) {
j = rnd.nextInt(LEN - i) + i;
t = seed[i];
seed[i] = seed[j];
seed[j] = t;
}
return Arrays.copyOf(seed, len); //注意:copyOf 需要 JRE1.6
}
//Unit Testing
public static void main(String[] args) {
final int N = 10000; //测试次数
for (int i = 0; i < N; ++i) {
int[] la = RandomUtil.getLotteryArray(1, 35, 7);
if (la == null) continue;
for (int v : la) System.out.printf("%0$02d ", v);
System.out.println();
}
}
}
import java.util.Arrays;
import java.util.Random;
/**
* <code>RandomUtil</code> - Random Tool Class.
* @author SageZk
* @version 1.0
*/
public class RandomUtil {
private RandomUtil() {}
private static Random rnd = null;
/**
* 初始化随机数发生器。
*/
private static void initRnd() {
if (rnd == null) rnd = new Random();
}
/**
* 计算并返回无重复值的以 <code>min</code> 为下限 <code>max</code> 为上限的随机整数数组。
* @param min 随机整数下限(包含)
* @param max 随机整数上限(包含)
* @param len 结果数组长度
* @return 结果数组
*/
public static int[] getLotteryArray(int min, int max, int len) {
//参数校验及性能优化
if (len < 0) return null; //长度小于 0 的数组不存在
if (len == 0) return new int[0]; //返回长度为 0 的数组
if (min > max) { //校正参数 min max
int t = min;
min = max;
max = t;
}
final int LEN = max - min + 1; //种子个数
if (len > LEN) return null; //如果出现 35 选 36 的情况就返回 null
if (len == 1) return new int[] {min}; //即 min == max 的情况
//计算无重复值随机数组
initRnd(); //初始化随机数发生器
int[] seed = new int[LEN]; //种子数组
for (int i = 0, n = min; i < LEN;) seed[i++] = n++; //初始化种子数组
for (int i = 0, j = 0, t = 0; i < len; ++i) {
j = rnd.nextInt(LEN - i) + i;
t = seed[i];
seed[i] = seed[j];
seed[j] = t;
}
return Arrays.copyOf(seed, len); //注意:copyOf 需要 JRE1.6
}
//Unit Testing
public static void main(String[] args) {
final int N = 10000; //测试次数
for (int i = 0; i < N; ++i) {
int[] la = RandomUtil.getLotteryArray(1, 35, 7);
if (la == null) continue;
for (int v : la) System.out.printf("%0$02d ", v);
System.out.println();
}
}
}
private static Random random = new Random();
public static int[] getRandomIntWithoutReduplicate2( int min, int max, int size )
{
int[] result = new int[size];
List<Integer> list = new ArrayList< Integer >();
//init list
for( int i = min; i < max; i++ )
{
list.add( i );
}
for( int i = 0; i < size; i++ )
{
int index = random.nextInt( list.size() );
result[i] = list.get( index );
list.remove( index );
}
return result;
}
ArrayList list = new ArrayList( Data );
int[] result = new int[size];
for( int i =0 ; i < size ; i++ )
{
int index = Rondom.nextInt( list.size() );
resut[i] = list.get( index );
list.remove( index );
}