不重复的随机数生成问题!
下面是我生成1到100之间不重复的随机数呢的代码,(规定用数组,不是用其它集合框架)可是总有一个回重复,不知道问题在哪里,请指点一二,谢谢:
代码:
import java.util.*;
public class Test {
public static void main(String[] args) {
int[] ints = new int[100];
for(int i=0;i<100;i++) {
int temp = (int) (Math.random()*100+1);
for(int j=0;j<100;j++) {
if(temp==ints[j]) {
temp = (int) (Math.random()*100+1);
j=0;
}
}
ints[i]=temp;
}
Arrays.sort(ints);
for(int index:ints) {
if(index%10==0)
System.out.println();
System.out.print(index+" ");
}
}
}
------解决方案--------------------第二个循环for(int j=0;j <100;j++)
改成for(int j=0;j <i;j++) 就可以了
------解决方案--------------------你这个代码效率太低,看看我BLOG中洗牌和数独的代码会对你有很大的启发
------解决方案--------------------很简单的问题,呵呵,一说破就大家都明白了。
这个问题的实际应用就比如要随机生成一副扑克牌,54张,顺序是乱的,但显然牌面不能重复。用随机数生成器生成的数总是会重复的,所以,不能把生成的数直接保存下来作为结果。那么怎么办?
你想想,如果是真实的扑克牌,你是怎么打乱的?你会说:洗牌啊!没错,就是洗牌!洗牌是什么过程?说白了,是交换!把两摞牌交换位置,用类似的方法就可以解决楼主的问题。
先按顺序在数组里生成1-100的数,然后产生一对0-99之间的随机数,把这两个数所表示下标的数交换位置,如此重复几十次,原先的数组就被打乱了。
------解决方案--------------------Math.random()生成的随机数能保证不重复吗?
------解决方案--------------------manbaum 的说法有一定道理,不过有一点不完整。
用“洗牌”方法最关键的一点,就是要抽出多少对数据交换多少次,简称(洗多少次牌?)。
理论上,至少洗 n/2 次才能洗到所有的牌。
但是,事实上,如果只洗 n/2 次,出现 没洗完所有牌 的几率很大
当然,如果出现一张至几张牌 还是在原来的位置,这种情况是绝对允许的。
下面,我贴了个算法,得出三组数据 比较两种 取随机数的方法。
数据表示有多少个数据在原位置上
取n/2对数据交换
0 0 0 2 2 2 3 1 0 1
375 346 361 371 370 380 378 378 358 367
取n对数据交换
0 2 0 2 1 0 0 2 1 1
120 139 147 147 126 133 144 139 132 140
取n*n对数据交换
2 2 0 0 0 2 1 0 1 1
0 1 0 0 3 2 1 0 0 1
Java code
public class Main {
public Main () {
start ();
}
public static void main (String[] args) {
new Main ();
}
private void start () {
for (int i = 0; i < m; i++) {
//
for (int j = 0; j < n; j++) {
iarr[j] = 0;
}
iarr_1[i][0] = g_1 ();
//
for (int j = 0; j < n; j++) {
iarr[j] = j;
}
iarr_1[i][1] = g_2 ();
}
for (int i = 0; i < 2; i++) {
for (int j = 0; j < m; j++) {
System.out.printf("%1$5s", iarr_1[j][i]);
}
System.out.println("");
}
}
private int g_1 () {
int j = 0;
while(j < n-1) {
int x = r.nextInt (n);
if (iarr[x] == 0) {
j++;
iarr[x] = j;
}
}
return check ();
}
private int g_2 () {
for (int i = 0; i < n*n; i++) {
int x = r.nextInt (n);
int y = r.nextInt (n);
{
int c = iarr[x];
iarr[x] = iarr[y];
iarr[y] = c;
}
}
return check ();
}
private int check () {
int j = 0;
for (int i = 0; i < n; i++) {
if (iarr[i] == i) {
j++;
}
}
return j;
}
private final int n = 1000;
private int[] iarr = new int[n];
private final int m = 10;
private int[][] iarr_1 = new int[m][2];
private java.util.Random r = new java.util.Random ();
}
------解决方案--------------------