关于csdn论坛将1-20 的数字乱序,我的个人解答

本文介绍了一种改进的随机数生成算法,通过递归的方式避免了传统双层for循环可能出现的性能问题,确保了生成的随机数集合中不会出现重复。

虽然不是很好,还是放上来

大家的思路都是for 循环,得到随机数,不重复添加,重复继续寻找随机数,知道满了为址

 

int[]  reInt=new int[20{-1,-1-,1-1.................};

for (int iCount=0;iCount<20;iCount++)

{

     
bool isFind=false;
     
int rand=new Random().Next(1,20);
     
for(int yCount=0;yCount<20;yCount++)
     
{
          
if(reInt[yCount]==rand)
          
{
                   isFind
=true;
                   
break;
           }

     }

      
     
if(isFind)
           iCount
--;      
     
else
          reInt[iCount]
=rand;
 }
 

 

大部分的书估计都是这样写,这样的缺点是单这个数字段如果是1000个的时候,很难判断这两个for循环什么时候会结束,不是简单的n*n哦。我的方法如下

 

  private  System.Random random = new Random();
        
private int iCount = 0;
        
private  int[] retInt=new int [20]{-1,-1.............};

 
public void GetRandom(int start ,int end)
        
{
            
if (start == end)
            
{
                retInt[iCount
++)=start;
                
return ;
            
            }

            
int mid= random.Next(start, end);

             retInt[iCount
++)=mid;        
             
//左边随机
              if(mid!=start) GetRandom(start, mid - 1);
             
//右边随机
              if (mid != end) GetRandom(mid + 1, end);
            
return ;
        }

 

这样20个数,就是20次随机,10000个就是1w次随机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值