为什么我两次产生的随机数是相同的呢?

jasonwang_1987 2009-11-09 04:52:09
我用两个Random随即产生两组数,为什么两组数相同呢?请高手解答怎么办。
代码:
public  string CreateZhzNumIdentifier()
{
Random rm = new Random();
int RmNum = 6;
System.Text.StringBuilder strRandom =new System.Text.StringBuilder();
for (int i = 0; i < RmNum; i++)
{
int nValue = rm.Next(0,9);
strRandom.Append(nValue.ToString());
}

return strRandom.ToString();
}

public string CreateBindingCode()
{
Random rm = new Random();
int RmNum = 6;
System.Text.StringBuilder strRandom =new System.Text.StringBuilder();
for (int i = 0; i < RmNum; i++)
{
int nValue = rm.Next(0,9);
strRandom.Append(nValue.ToString());

}
return strRandom.ToString();
}

两个方法生成的随即数一样,为啥啊????
...全文
1564 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingxuejiao 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gomoku 的回复:]
CreateZhzNumIdentifier();
Thread.Sleep(1000);
CreateBindingCode();

先试验加一个Thread.Sleep,它们是不是就不一样了?
提示:Random的无参构造以当前的时间为伪随机种子。
[/Quote]

空军好厉害!!!
学习!
wartim 2009-11-09
  • 打赏
  • 举报
回复
10楼说了我就不说了,无参是用时间做默认种子的,不sleep一下,时间种子是一样的
wuyi8808 2009-11-09
  • 打赏
  • 举报
回复
10楼说的也很对。
wuyi8808 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jasonwang_1987 的回复:]
应该把Random rm=new Random();拿到外面就对了。
[/Quote]
见7楼。




[Quote=引用 8 楼 jasonwang_1987 的回复:]
至于为什么我也不知道。
[/Quote]
原因是默认以系统时间为种子,两次 new 的时间间隔非常短,时间相同,种子相同,所以生成的随机数相同。
如果你单步执行,就不会相同了。
gomoku 2009-11-09
  • 打赏
  • 举报
回复
CreateZhzNumIdentifier();
Thread.Sleep(1000);
CreateBindingCode();

先试验加一个Thread.Sleep,它们是不是就不一样了?
提示:Random的无参构造以当前的时间为伪随机种子。
sn_wolf 2009-11-09
  • 打赏
  • 举报
回复
你找下random.next的用法,

Random rd=new Random();
int n=rd.Next(100,500)
这样N就是一个100到500之间的一个随机数。

还有其他的.. 要不就是系统有问题.
jasonwang_1987 2009-11-09
  • 打赏
  • 举报
回复
谢谢各位的鼎力相助,我已经找到答案了,答案不是种子的原因,之所以会产生形同的随机数组是因为我在两个方法里都分别new了一个Random这是不对的,应该把Random rm=new Random();拿到外面就对了。
至于为什么我也不知道。哈哈。
wuyi8808 2009-11-09
  • 打赏
  • 举报
回复
Random rm = new Random(); 

public string CreateZhzNumIdentifier()
{
int RmNum = 6;
System.Text.StringBuilder strRandom =new System.Text.StringBuilder();
for (int i = 0; i < RmNum; i++)
{
int nValue = rm.Next(0,9);
strRandom.Append(nValue.ToString());
}

return strRandom.ToString();
}

public string CreateBindingCode()
{
int RmNum = 6;
System.Text.StringBuilder strRandom =new System.Text.StringBuilder();
for (int i = 0; i < RmNum; i++)
{
int nValue = rm.Next(0,9);
strRandom.Append(nValue.ToString());

}
return strRandom.ToString();
}
vrhero 2009-11-09
  • 打赏
  • 举报
回复
一般的软件随机数发生器都是伪随机数,.NET提供的也不例外...所以你必须每次都用一个不同的种子值初始化随机数发生器...
[Quote=引用 MSDN:]
伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。Random 类的当前实现是基于 Donald E. Knuth 的减随机数生成器算法的。有关更多信息,请参见 D. E. Knuth."The Art of Computer Programming, volume 2: Seminumerical Algorithms"。Addison-Wesley,Reading,MA,second edition,1981。

随机数的生成是从种子值开始。如果反复使用同一个种子,就会生成相同的数字系列。产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。
[/Quote]
虽然你用了两个不同的方法,但你只要在大约15ms内(PC OS的时钟精度)执行这两个方法得到的伪随机数就一样...
CsToD 2009-11-09
  • 打赏
  • 举报
回复
默认是以时间为种子的,因为程序运行快,所以时间一样,造成生成的数一样

解决办法:
把两个方法里的
Random rm = new Random();
删掉,写成字段:
class ..
{
Random rm=new Random();
public string CreateZhzNumIdentifier(){}
public string CreateBindingCode(){}

}
freeboy827 2009-11-09
  • 打赏
  • 举报
回复
不会吧, 我这里不会
mengpaihuai 2009-11-09
  • 打赏
  • 举报
回复
你所写的随机数据的种子不对!
比如:int number = random.Next(1000, 10000^900);
这样每次你所得到的数据都是不一样的!
jasonwang_1987 2009-11-09
  • 打赏
  • 举报
回复
楼上,具体点,怎么做,谢谢啦。
还有,你怎么知道我上课没好好听呢?费解。
Dobzhansky 2009-11-09
  • 打赏
  • 举报
回复
上课没好好听
给 Random 个种子

111,115

社区成员

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

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

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