如何生成不重复的随机数

yuanxueli 2008-12-27 11:10:48
生成思路:生成随机数,然后判断与前次生成的随机数是否相同,相同的话就重新生成;
但是执行后每次生成的随机数都相同,什么问题呢?请高手指点,谢谢!

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;
}
...全文
1196 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiqufu 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 aith1986 的回复:]
以Random ran = new Random(System.DateTime.Now.Millisecond);
微秒来做参照,基本不会重复的
[/Quote]



for (int i = 0; i < m; i++)
{
System.Random a = new Random(System.DateTime.Now.Millisecond + i);
int RandomNum = a.Next(1, n);

}
yuanxueli 2008-12-28
  • 打赏
  • 举报
回复
谢谢各位帮助
按照9楼和15楼的修改意见
把随机对象放到函数外
现在生成的随机数不重复了
aith1986 2008-12-28
  • 打赏
  • 举报
回复
以Random ran = new Random(System.DateTime.Now.Millisecond);
微秒来做参照,基本不会重复的
xcopop 2008-12-28
  • 打赏
  • 举报
回复
受教了~正学习C# 中,
烈火蜓蜻 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuanxueli 的帖子:]
生成思路:生成随机数,然后判断与前次生成的随机数是否相同,相同的话就重新生成;
但是执行后每次生成的随机数都相同,什么问题呢?请高手指点,谢谢!

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…
[/Quote]

楼主你肯定是 在一个循环里调用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);
这样就可以达到你想到的目的了
zedzhao 2008-12-28
  • 打赏
  • 举报
回复
up...
笺香 2008-12-28
  • 打赏
  • 举报
回复
如果要输出的随机数不重复,都把生成好了的,放到一个列表中
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
笺香 2008-12-28
  • 打赏
  • 举报
回复
6楼说的不错。
lewyi 2008-12-28
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
龙宜坡 2008-12-27
  • 打赏
  • 举报
回复
mark,代码帖
satan_dongdong 2008-12-27
  • 打赏
  • 举报
回复
关键是种子的问题
net5i 2008-12-27
  • 打赏
  • 举报
回复
int myran = 10;//初始化myran 
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,楼主改成上面代码肯定正确
much0726 2008-12-27
  • 打赏
  • 举报
回复

int myran = 10;
for (int i = 0; i < 10; i++)
{
GenForInt(0, 10, ref myran);
}
Console.Read();

我这样调用没有问题啊.哪里重复了?
much0726 2008-12-27
  • 打赏
  • 举报
回复

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;
}
wuyq11 2008-12-27
  • 打赏
  • 举报
回复
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;
  }
参考http://www.cnblogs.com/happyhippy/archive/2007/04/03/698384.html
wuyi8808 2008-12-27
  • 打赏
  • 举报
回复
int myran = 10;//初始化myran 
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;
}
yuanxueli 2008-12-27
  • 打赏
  • 举报
回复
请高手指点,谢谢!
xhueducls 2008-12-27
  • 打赏
  • 举报
回复
用GUID.Newguid().GethashCode()生成种子
蛋炒饭 2008-12-27
  • 打赏
  • 举报
回复
ran = new Random(unchecked((int)DateTime.Now.Ticks));
放到循环体外

110,580

社区成员

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

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

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