要从一个列表中随机去指定数量的数据:
List aList=new ArrayList();
//假设aList.size()=100,从aList中随机取20条不同的记录
//同时取多遍取出的20条记录也不近相同//例如随机从100道考题中随机取出20道考题,并且每个考生取出的这20道考题不能完全重复。各位帮忙啊,急啊
List aList=new ArrayList();
//假设aList.size()=100,从aList中随机取20条不同的记录
//同时取多遍取出的20条记录也不近相同//例如随机从100道考题中随机取出20道考题,并且每个考生取出的这20道考题不能完全重复。各位帮忙啊,急啊
解决方案 »
- 一个新手的问题:创建对象的时候 是否在内存中开辟了对象空间
- 登录的确定和取消按钮为什么不出现。
- 关于多线程的问题
- 如何向 Runtime.getRuntime().exec("cmd /c start") 持续发送指令。
- 用BufferedInputStream进行数据流的读取时为何总是有数据包丢失?
- 复制一个ZIP文件到另一个路径?
- 急求!!!关于JTable 与 JCheckBox
- ArrayList已经取代了Vector为什么Sun的例子里还在用Vector,包括最新的例子,这是为什么?
- THREAD 中 ,怎么样共享数据,能不能给个例子啊
- 各位大侠,知道哪有《JAVA2核心技术卷I/II》pdf电子版吗?!
- 急死了,毫无头绪
- 关于JTable的双击问题!
public int getNum(int maxNum) {
return (int)(Math.random()*maxNum);
}
public int [] getAll(int size) {
int [] result = new int[size];
int tmp = 0;
for (int i = 0; i < size; i++) {
tmp = getNum(100);
if (repeat(result,tmp)) {
i--;
continue;
}
result[i] = tmp;
}
}
private boolean repeat(int [] nums,int num) {
for (int i = 0; i < nums.length; i++) {
if (num == nums[i]) {
return true;
}
}
return false;
}
}
int [] result = new int[size];
int tmp = 0;
for (int i = 0; i < size; i++) {
tmp = getNum(100);
if (repeat(result,tmp)) {
i--;
continue;
}
result[i] = tmp;
}
return result;
}
如果考生数量不多的话,先写一个从100中随机取20个数,并将结果放入一个 Set 的函数。
构造一个ArrayList storage。storage储存已经取过的随机数组合。每次调用这个函数后,先比较这个组合是否在storage中已经出现过,如果没有,就插入里面。否则再调用函数,生成新的组合。
如果考生数目不多的话,这个方法效率不错,而且够简单。如果考生数目达到n=100!/(20!*80!)的一半或者更多的话,那么这个方法就不行了。
这种情况下,比较好的方法是用一个LinkList availList存储还没有生成的随机数,(应该用BigDecimal,因为long也不够长。)
首先初始化availList,依次填入1到n。
然后随机生成一个1到 availList.length()的随机数t。并从availList中移出第t个数,这就是要取的数。重复此操作,直到取出的数满足要求,或者取完availList
int size=list.size();
int[]result = new int[size];
for(int i=0; i<考题数; i++){
Integer v = list.remove(Math.random()*(size-i));
result[i] = (Integer)v.intValue();
}
取出的t是一个1到n的数,代表的是一种 20个数的组合。取出来以后,还要把t转换成20个数的组合。这种映射方法很多,自己随便写一个
不过 pauliuyou(paul) () 信誉:100 给出的函数取值getAll(100)就不行了,就是说从100个里面取100个随机数就出现错误了!怎么样简单的解决呢?
我以前做过是用的Vector v。
1. v中按顺序放入1-100。
2. 取出1-v.length中一个随机数r。
3. 返回v中的第r个元素。
4. 在v中除去第r个元素。
5. 重复第2步。由于v中已取的值去掉了,所以可以保证不重复。 //get an int array contains 0-99 in random order
public void randomizeNumbers()
{
Vector v=new Vector(100);
Random r=new Random();
//initialize vector contains 0-99 by order
for(int i=0;i<100;i++)
{
v.addElement(""+i);
}
for(int i=99;i>-1;i--)
{
//get a pseudo-random number n from 0 to vector's length
int n=r.nextInt(i+1);
//ss keeps the number(in String form) in vector's element listed n
String ss=(String)v.get(n);
//ss passes the number to s[i](in String form)
s[i]=ss;
//remove element listed n
v.remove(n);
}
}
在执行getAll(100,100)时会执行不下去,执行getAll(100,<100的值)时就没有问题,请大家看看这是那里出错了呢?
public static int getNum(int maxNum) {
return (int)(Math.random()*(maxNum));
} public static int [] getAll(int size,int maxNum) {
int [] result = new int[size];
int tmp = 0;
for (int i = 0; i < size; i++) {
tmp = getNum(maxNum);
if (repeat(result,tmp)) {
i--;
continue;
}
result[i] = tmp;
}
return result;
}
private static boolean repeat(int [] nums,int num) {
for (int i = 0; i < nums.length; i++) {
if (num == nums[i]) {
return true;
}
}
return false;
}
你的这个方法已经被我注册了,呵呵。
如果你想让相邻的考生考题不重复的话,可以在第一个考生抽题之后在剩下的考题中为第二个考生抽题,这样依次类推就可以做到了。
int a[100];
for(int i = 0; i < 100; i++)
{
a[i] = i;
}for(int i = 0; i < 50; i++)
swap(a[rand() * 100 / RAND_MAX], a[rand() * 100 / RAND_MAX]);for(int i = 0; i < 20; i++)
cout << a[i] << endl;