关于这个问题 虽然以前看到别人遇到过 不过当时没有管也就算了
但是最近由于要用到于是自己就想了一下 发现自己能想出解决办法所以 就没有没有去查资料了
说说个人思路把 其实开始的思路比较扯蛋 比如我要生成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; }
网上有很多 关于生成不重复随机数的方法 可以去参考一下 这里列举的只是我自己当时做的时候想出来的而已、、虽然和网上的有重复、、经供参考、、、