java教程

Java生成不重复的随机数

位置:首页 > java教程 > java技巧,2013-09-25
关于Java生成不重复的随机数这个问题虽然以前看到别人遇到过不过当时没有管也就算了但是最近由于要用到于是自己就想了一下发现自己能想出解决办法所以就没有没有去查资
关于Java生成不重复的随机数这个问题 虽然以前看到别人遇到过 不过当时没有管也就算了


但是最近由于要用到于是自己就想了一下 发现自己能想出解决办法所以 就没有没有去查资料了


说说个人思路把 其实开始的思路比较扯蛋 比如我要生成2个不重复1 - 5之间的随机数


假若第一次生成了 3 那么第二次生成的数 X 判断一下这个 X 刚才是不是已经出现过了 如果出现过了 再来一次

Random rnd = new Random();
List<int> lstResult = new List<int>();
while(lstResult.Count < 2){        //直到有两个为止
    int temp = rnd.Next(1,6);
    if(lstResult.Contains(temp))    //如果存在了 就再来一次循环
        continue;
    lstResult.Add(temp);
}

这样看是确实解决了 不过会出现悲剧的情况 比如 我要生成99个 1 - 100的数


那么 运行的效果就看人品了 谁也无法保证每个数会出现几次重复 所以也不知道要多少次循环 才能出现99个不一样的


这么做只适合于 要求个数不多且区间范围大的那种 比如 生成几个 1 - 10000 之间的数这样出现重复的几率相对比较小


然后 我又想了一种这种速度上来说还算可以 不过感觉有点浪费空间


然后我又在网上去查了一下 发现还是有类是的思路的


其实最开始想到这个思路是这样  我当时在想 假设我要生成 100 个 1 - 100 的数 那么我得到的结果 不就是1 - 100里面的所有数么


然后我就想到了数组一个 1 - 100 的数组 然后 把里面的顺序全部打乱就是我要的结果


这里就用 1 - 10 举例子


先生成一个 arrIndex[10] 里面全部是 1 - 10 的数据


如果我要 5 个不重复的 那么就做五次循环


for(int i = 0;i < 5;i++)
然后生成是随机数


int rndNum = rnd.Next(i ,10);
把这个生成是随机数rndNum作为 arrIndex 数组的索引


把arrIndex[i] 和 arrIndex[rndNum]两个数交换一下


原始数组:
x   0   1   2   3   4   5   6   7   8   9
x   1   2   3   4   5   6   7   8   9   10
   
第 1 次随机数 rndNum = rnd.Next(0,10) 0 <= [3] < 10
把索引为 3 的和第 i(0) 个交换
0      1   2   3   4   5   6   7   8   9
4      2   3   1   5   6   7   8   9   10


第 2 次随机数 rndNum = rnd.Next(1,10) 1 <= [7] < 10
把索引为 7 的和第 i(1) 个交换
0   1      2   3   4   5   6   7   8   9
4   8      3   1   5   6   7   2   9   10


第 3 次随机数 rndNum = rnd.Next(2,10) 2 <= [5] < 10
把索引为 5 的和第 i(2) 个交换
0   1   2      3   4   5   6   7   8   9
4   8   6      1   5   3   7   2   9   10


第 4 次随机数 rndNum = rnd.Next(2,10) 3 <= [7] < 10
把索引为 7 的和第 i(3) 个交换    (这次又出现了7 但刚才已经被交换了)
0   1   2   3      4   5   6   7   8   9
4   8   6   2      5   3   7   1   9   10

第 5 次随机数 rndNum = rnd.Next(2,10) 4 <= [6] < 10
把索引为 6 的和第 i(4) 个交换
0   1   2   3   4      5   6   7   8   9
4   8   6   2   7      3   5   1   9   10
上面的步骤中 从随机数来说 生成了两个 7 但是 如果把这个 7 作为索引去打乱有个有序的集合 然后取出左边x个就是想要的不重复的随机数字

代码:
int[] arrNums = new int[10];
for (int i = 0; i < 10; i++)
    arrNums[i] = i + 1;
Random rnd = new Random();
for (int i = 0; i < 5; i++)
{
    int index = rnd.Next(i, 10);
    int temp = arrNums[index];
    arrNums[index] = arrNums[i];
    arrNums[i] = temp;
}
网上有很多 关于生成不重复随机数的方法 可以去参考一下   这里列举的只是我自己当时做的时候想出来的而已、、虽然和网上的有重复、、经供参考、、、

TAGS:生成不重复的随机数

猜你喜欢

NewHot