生成不重复随机数_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 生成不重复随机数

生成不重复随机数

 2013/9/24 21:04:25  crystal_lz  博客园  我要评论(0)
  • 摘要:关于这个问题虽然以前看到别人遇到过不过当时没有管也就算了但是最近由于要用到于是自己就想了一下发现自己能想出解决办法所以就没有没有去查资料了说说个人思路把其实开始的思路比较扯蛋比如我要生成2个不重复1-5之间的随机数假若第一次生成了3那么第二次生成的数X判断一下这个X刚才是不是已经出现过了如果出现过了再来一次Randomrnd=newRandom();List<int>lstResult=newList<int>();while(lstResult.Count<2)
  • 标签:

关于这个问题 虽然以前看到别人遇到过 不过当时没有管也就算了

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

说说个人思路把 其实开始的思路比较扯蛋 比如我要生成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   101 次随机数 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   102 次随机数 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   103 次随机数 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   104 次随机数 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   105 次随机数 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;
}

网上有很多 关于生成不重复随机数的方法 可以去参考一下   这里列举的只是我自己当时做的时候想出来的而已、、虽然和网上的有重复、、经供参考、、、

  • 相关文章
发表评论
用户名: 匿名