C# 产生随机数 为什么还会有重复

zhaowb201314 2009-04-07 12:15:58
利用递归不让产生重复的数,但还是会有重复,请高手指点。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
public static 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;
}
public static int[] getRandomNum(int num, int minValue, int maxValue)
{
Random ra = new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum = new int[num];
int tmp = 0;
for (int i = 0; i <= num - 1; i++)
{
tmp = ra.Next(minValue, maxValue); //随机取数
arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //取出值赋到数组中
}
return arrNum;
}
static void Main(string[] args)
{
int aa =10;
int Num = 8;
int[] num3 = new int[Num];
num3=getRandomNum(Num,1,aa);
foreach (int s in num3) //遍历数组
Console.WriteLine(s);
}
}
}
...全文
271 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2009-04-07
  • 打赏
  • 举报
回复
public int[] GetRandomArray(int Number,int minNum,int maxNum)
{
int j;
int[] b=new int[Number];
Random r=new Random();
for(j=0;j<Number;j++)
{
int i=r.Next(minNum,maxNum);
int num=0;
for(int k=0;k<j;k++)
{
if(b[k]==i)
{
num=num+1;
}
}
if(num==0 )
{
b[j]=i;
}
else
{
j=j-1;
}
}
return b;
}
http://www.cnblogs.com/Fooo/archive/2008/12/28/1364094.html
liujiayu10 2009-04-07
  • 打赏
  • 举报
回复
这个问题是由于CPU运算时钟太快导致,连续两次出现的随机种子一样

解决方法是:连续生成随机数的索引做为参数,生成随机数,这样就不会重复了

如:


//返回一个随机字符串
public string RandStr(int iCount)
{
Random rand = new Random(unchecked(iCount * (int)DateTime.Now.Ticks));
return DateTime.Now.ToString("yyyyMMddHHmmss") + rand.Next(100, 999).ToString();
}
baoxuetianxia 2009-04-07
  • 打赏
  • 举报
回复
int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count<100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i<100;i++)
intArr[i]=(int)myList[i];
产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
应该有很多种方法的哦。
我也是刚学不久哦。呵呵。
大概算法 就是上面那样吧 应该
vbman2003 2009-04-07
  • 打赏
  • 举报
回复

class Program
{
public static void Main()
{
int n = 10, min = 1, max = 10;
int[] arr=GetRndArray(n,min,max);

foreach (int v in arr)
{
Console.Write("{0} ", v);
}
Console.WriteLine();

}

static int[] GetRndArray(int Number, int minNum, int maxNum)
{
int n=maxNum -minNum+1;
int[] a = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = minNum+i ;
}
Random rnd=new Random();
int[] b = new int[Number];
for (int i = 0; i < Number ; i++)
{
int r = rnd.Next(i,n);
b[i] = a[r];
a[r] = a[i];
}
return b;
}
}
hupengcscs 2009-04-07
  • 打赏
  • 举报
回复
up
jietuan 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liujiayu10 的回复:]
这个问题是由于CPU运算时钟太快导致,连续两次出现的随机种子一样

解决方法是:连续生成随机数的索引做为参数,生成随机数,这样就不会重复了

如:


C# code
//返回一个随机字符串
public string RandStr(int iCount)
{
Random rand = new Random(unchecked(iCount * (int)DateTime.Now.Ticks));
return DateTime.Now.ToString("yyyyMMddHHmmss") + rand.Nex…
[/Quote]


正解
陶庆 2009-04-07
  • 打赏
  • 举报
回复
机器产生的随机数只不过是伪随机数。。
Myth_NiuNiu 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
public int[] GetRandomArray(int Number,int minNum,int maxNum)
{
int j;
int[] b=new int[Number];
Random r=new Random();
for(j=0;j <Number;j++)
{
int i=r.Next(minNum,maxNum);
int num=0;
for(int k=0;k <j;k++)
{
if(b[k]==i)
{
num=num+1;
}
}
if(num==0 )
{
b[j]=i;
}
else
{
j=j-1;

[/Quote]

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧