【SOS】怎么产生1-100之间的100个不重复的随机整数才能效率高? 本帖最后由 ameyume 于 2011-03-27 16:49:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 List里添加1到100这100个整数,然后用java.util.Collections.shuffle一下,然后每次remove List中index为0的元素 注意使用LinkedList,不要用ArrayList 为什么不能是ArrayList??ArrayList<Integer> array =new ArrayList<Integer>(); for (int i = 0; i < 100; i++) { array.add(i); } Collections.shuffle(array);array就是你要的随机数组 一样的想法!不过对楼上的那位高人问个问题,为什么不能用ArrayList?是它按顺序去找? 因为我说每次移除index为0的元素嘛,如果用ArrayList的话,每次将第一个元素移除掉后,后面的元素都要前移,而LinkedList只需改变头元素的指向即可,效率更高。学过数据结构的应该能明白 谢谢各位高人,我对java掌握还是太肤浅了。 可以试试这个:public class Test { public static void main(String[] args) { int[] a = new int[100]; for(int i=0; i<100; i++) a[i] = i+1; for(int i=99; i>0; i--) { int temp = (int)(Math.random()*100)%i; int t = a[temp]; a[temp] = a[i]; a[i] = t; } }} 也就是说3L用ArrayList,在执行shuttle时,因为ArrayList还是数组的形式,效率上没有LinkList高。 那就是每次list中index为0的元素作为产生的随机数,放在arr数组中就可以了。明白了。谢谢! 又是洗牌算法1、创建长度为100的整数数组 int[] a = new int[100]2、初始化它们:a[0] = 1, a[1] = 2, a[2] = 3......a[99]=1003、得到0~99之间的随机数 b,比如得到 b = 34,并且将 a[b] 和 a[99] 交换4、得到0~98之间的随机数 b,比如 b = 29,并且将 a[b] 和 a[98] 交换5、得到0~97之间的随机数 b,比如 b = 34,并且将 a[b] 和 a[97] 交换......n、得到0~1之间的随机数 b,比如 b = 1,并且将a[b] 和 a[1] 进行交换 个人觉得这个效率应该最高,Collections的shuffle差不多也就上面那个思路把 用collection肯定会因为方便操作而牺牲效率,而且牺牲非常严重7楼得实现和11楼的思路类似,而且int temp = (int)(Math.random()*100)%i;这句其实改成int temp = (int)(Math.random()*i);就好了 java的变量初始化的困惑 java中不支持String转float 与double应用了吗 java接口的常量为什么一定要赋值 如何给一个panel加上监听! 一个关于JAVA类库的问题~!帮帮忙~! 线程加锁? 关于文件流输出 如何搜索局域网上的计算机 急!请问北京哪里能买到SL275教材? java,list中取值的问题 [[[迷惑]]]在类里面声明一个本类的对象有什么作用? 碰到一个以前没注意过的问题关于boolean的“=”“==”的问题
ArrayList<Integer> array =new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
array.add(i);
}
Collections.shuffle(array);array就是你要的随机数组
一样的想法!不过对楼上的那位高人问个问题,为什么不能用ArrayList?
是它按顺序去找?
public static void main(String[] args) {
int[] a = new int[100];
for(int i=0; i<100; i++)
a[i] = i+1;
for(int i=99; i>0; i--) {
int temp = (int)(Math.random()*100)%i;
int t = a[temp];
a[temp] = a[i];
a[i] = t;
}
}
}
明白了。谢谢!
2、初始化它们:a[0] = 1, a[1] = 2, a[2] = 3......a[99]=100
3、得到0~99之间的随机数 b,比如得到 b = 34,并且将 a[b] 和 a[99] 交换
4、得到0~98之间的随机数 b,比如 b = 29,并且将 a[b] 和 a[98] 交换
5、得到0~97之间的随机数 b,比如 b = 34,并且将 a[b] 和 a[97] 交换
......
n、得到0~1之间的随机数 b,比如 b = 1,并且将a[b] 和 a[1] 进行交换
个人觉得这个效率应该最高,Collections的shuffle差不多也就上面那个思路把
int temp = (int)(Math.random()*100)%i;
这句其实改成
int temp = (int)(Math.random()*i);就好了