c# 从一组数中随机抽取一定个数_C#生成指定范围内的不重复随机数

C#生成指定范围内的不重复随机数

// Number随机数个数

// minNum随机数下限

// maxNum随机数上限

public int[] GetRandomArray(int Number,int minNum,int maxNum)

{

int j;

int[] b=new int[Number];

Random r=new Random();

for(j=0;j

{

int i=r.Next(minNum,maxNum+1);

int num=0;

for(int k=0;k

{

if(b[k]==i)

{

num=num+1;

}

}

if(num==0 )

{

b[j]=i;

}

else

{

j=j-1;

}

}

return b;

}

下面来介绍下其他网友的实现方法:

方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把随机抽取到的位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),将该位置的数用最后的数代替。

int[] index = new int[15];

for (int i = 0; i < 15; i++)

index = i;

Random r = new Random();

//用来保存随机生成的不重复的10个数

int[] result = new int[10];

int site = 15;//设置上限

int id;

for (int j = 0; j < 10; j++)

{

id = r.Next(1, site - 1);

//在随机位置取出一个数,保存到结果数组

result[j] = index[id];

//最后一个数复制到当前位置

index[id] = index[site - 1];

//位置的上限减少一

site--;

}

方法2:利用Hashtable。

Hashtable hashtable = new Hashtable();

Random rm = new Random();

int RmNum = 10;

for (int i = 0; hashtable.Count < RmNum; i++)

{

int nValue = rm.Next(100);

if (!hashtable.ContainsValue(nValue) && nValue != 0)

{

hashtable.Add(nValue, nValue);

Console.WriteLine(nValue.ToString());

}

}

方法3:递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。

Random ra=new Random(unchecked((int)DateTime.Now.Ticks));

int[] arrNum=new int[10];

int tmp=0;

int minValue=1;

int maxValue=10;

for (int i=0;i<10;i++)

{

tmp=ra.Next(minValue,maxValue); //随机取数

arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中

}

.........

.........

public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)

{

int n=0;

while (n<=arrNum.Length-1)

{

if (arrNum[n]==tmp) //利用循环判断是否有重复

{

tmp=ra.Next(minValue,maxValue); //重新随机获取。

getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。

}

n++;

}

return tmp;

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值