C#一个产生随机不重复数组的方法

 在.NET技术 C#区看到一个小问题: 从1,50随机20个不重复数

问题不复杂,提问者其实已经有了自己的答案,但他似乎觉得答案不太理想。
ArrayList list  =   new  ArrayList();
int  k  =   0 ;
do
{
=random .Next (1,51);
if (!list.Contains(k))
list.Add(k);
}

while  (list.Count  <   20 );

这种方法应该说比较常规,效率也算不差了。但有没有更好的方法呢?换个思路想一想就有了 下面这个方法。

此方法经测试性能会有所提高,尤其是结果较大时。


public   int [] Get Random UnrepeatArray( int  minValue,  int  maxValue,  int  count)
{
            Random rnd 
= new Random();
            int length = maxValue - minValue + 1;
            
byte[] keys = new byte[length];
            rnd.NextBytes(keys);
            
int[] items = new int[length];
            
for (int i = 0; i < length; i++)
            
{
                items[i] 
= i + minValue;
            }

           
Array.Sort(keys, items);
            
int[] result = new int[count];
            Array.Copy(items, result, count);
            
return result;
}


和常规思路不同,不是采取先获取一个随机数查找有无重复之后加入结果集,而是先 利用 Random. NextBytes 方法 得到一个随机数字节数组 ,然后利用 Array.Sort 的重载方法用这个随机数字节数组 顺序 数组排序为乱序,最后 Copy 出结果集。

由于只用了一个循环来 为顺序 源数组赋初值,只使用了简单数组类型而没有用集合或泛型集合类, 利用 Random. NextBytes 方法一次获得一组随机数而不是在循环中多次调用, Array.Copy 方法复制结果集。因而性能得到优化。

这里要注意 Random. NextBytes 方法获得的数组是字节数组,其长度大于 256 时必定是有重复的,但 Array.Sort 方法的 QuickSort 算法刚好是不稳定排序,这样我们得到的排序结果刚好符合要求。

另外这里的随机数仅作为排序用,所以这个方法只需要改动返回类型和
源数组赋初值的操作就可以输出任何简单数据类型的随机不重复数组。

其实这个例子如果用C++或别的什么语言来实现我们可以有更多的优化考虑,但.NET的优点在于让我们可以摆脱那些头痛的算法而更多的关注业务。

最后,如果不考虑性能用泛型类尤其是排序泛型类来写代码可以更简练。
评论 6 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

vrhero

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值