生成思路:生成随机数,然后判断与前次生成的随机数是否相同,相同的话就重新生成;
但是执行后每次生成的随机数都相同,什么问题呢?请高手指点,谢谢!int myran = 10;//初始化myran
public static int GenForInt(int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
Random ran;
int RandKey;
do
{
ran = new Random(unchecked((int)DateTime.Now.Ticks));
RandKey = ran.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}
但是执行后每次生成的随机数都相同,什么问题呢?请高手指点,谢谢!int myran = 10;//初始化myran
public static int GenForInt(int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
Random ran;
int RandKey;
do
{
ran = new Random(unchecked((int)DateTime.Now.Ticks));
RandKey = ran.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}
public static int GenForInt(int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
Random ran;
ran = new Random(unchecked((int)DateTime.Now.Ticks));
int RandKey;
do
{
RandKey = ran.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}
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;
}
参考http://www.cnblogs.com/happyhippy/archive/2007/04/03/698384.html
private static int myran = 10;//初始化myran //myran要静态的否则每次用都会一样
public static int GenForInt(int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
Random ran;
int RandKey;
do
{
ran = new Random(unchecked((int)DateTime.Now.Ticks));
RandKey = ran.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}
int myran = 10;
for (int i = 0; i < 10; i++)
{
GenForInt(0, 10, ref myran);
}
Console.Read();
我这样调用没有问题啊.哪里重复了?
public static int GenForInt(int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
Random ran = new Random();
int RandKey;
do
{
RandKey = ran.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}
.NET中随机数生成器的默认种子就是DateTime.Now.Ticks,楼主改成上面代码肯定正确
放到循环体外
Random rnd = new Random();
比如说输出1-100不重复的随机数
List<int> list=new List<int>();
for(int i=0;i<100;i++)
{
int value=rnd.Next(1, 101);
while(list.Contains(value))
{
value=rnd.Next(1, 101);}
list.Add(value);}然后输出list
楼主你肯定是 在一个循环里调用GenForInt函数吧,呵呵,因为一个循环,如果循环的次数不是非常多的话,他很可能在一百万分之一内执行完成,因此楼主的代码
new的一个新对象,肯定是用了同一个种子值的,不同随机对象(因为如果是同种子的,同一个对象,但是他每次的Next都会产生不同的Int数值)而你每次都是产生一样的数值,那只有一个可能,那就是你的同一个种子,不同的对象,而产生的相同的数值。所你楼主你的代码是有问题的,
还有6楼的代码和你的代码,几乎不存在任何区别,他的代码将会产生和你一样的问题,你的代码需要这样改变
int myran = 10;// 初始化myran
Random ran = new Random();// 把随机对象放到函数外public static int GenForInt(Random rand, int minvalue, int maxvalue,ref int myran) //自动生成int型的随机数据
{
int RandKey;
do
{
RandKey = rand.Next(minvalue, maxvalue);
}while (RandKey == myran);
Console.WriteLine("RandKey:" + RandKey);
myran = RandKey; //将本次的随机值赋给myran
return RandKey;
}而你调用就这样
GenForInt(ran, 1, 100, myran);
这样就可以达到你想到的目的了
微秒来做参照,基本不会重复的
for (int i = 0; i < m; i++)
{
System.Random a = new Random(System.DateTime.Now.Millisecond + i);
int RandomNum = a.Next(1, n);
}