返回信息流今天下午在调试程序时,发现随机函数生成的随机数总是一个值,而单步跟踪的时候又能够出现随机的效果,一直很奇怪。代码大致如下所示:
for(int i=0;i<10;i++)
{
Random random=new Random();
int index=random.Next(10);
}
后来到网上看了一下,才知道.net的随机函数与随机数种子seed有关,也就是传给Random构造函数的参数。如上面代码所示,在构造Random时采用了默认构造函数,系统就会使用当前系统时间作为随机数种子,然而计算机运行上述代码非常的快,系统时间没有发生变化,也就是说随机数种子不会变,这样出来得随机数就是一样的了。
解决这个问题的方法就是,每次循环要给Random构造函数传递一个不同的种子。网上给的比较简单的方法是,每次产生一个新的Guid对象,然后用它的散列值(每个Guid对象的散列值是不同的)作为构造函数的参数,如下所示:
for(int i=0;i<10;i++)
{
Random random=new Random(Guid.NewGuid().GetHashCode());
int index=random.Next(10);
}
一点小小的经验,抛砖引玉,希望各位大牛小牛能够多多分享自己在学习中的经验啊!
这是一条镜像帖。来源:北邮人论坛 / dot-net / #980同步于 2009/12/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
dotNET机器人发帖
.net中使用随机函数的一点经验
KilltheThree
2009/12/29镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
非常赞!
可不可以自己写一个随机数呢?
【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】
: 今天下午在调试程序时,发现随机函数生成的随机数总是一个值,而单步跟踪的时候又能够出现随机的效果,一直很奇怪。代码大致如下所示:
: for(int i=0;i<10;i++)
: {
: ...................
for(int i=0;i<10;i++)
{
Random random=new Random();
int index=random.Next(10);
}
这个好奇怪啊,弱问,如果把第一句放到循环外面去,能正常工作么?
为什么要产生10次random生成器呢?
话说random还有其他使用方式,可以把这个函数的所有功能看下
ps:记得就算不每次都new,在短时间内得到的数也是一样的
可以check下
【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】
: 惭愧!还没想过呢。。。
: 嗯,好好想想先
【 在 ericyosho 的大作中提到: 】
: for(int i=0;i<10;i++)
: {
: Random random=new Random();
: ...................
我也认为把new放到循环外面即可,性能比放在里面提升一个量级
的确是可以把new放在循环外面,可以正常工作。主要是实际的代码中,循环体里面特别长,当时单独写了一个函数出来,所以每次new都在循环体里面。由于对随机函数机制理解得不够清楚,所以才产生了困惑。
【 在 KilltheThree 的大作中提到: 】
: 的确是可以把new放在循环外面,可以正常工作。主要是实际的代码中,循环体里面特别长,当时单独写了一个函数出来,所以每次new都在循环体里面。由于对随机函数机制理解得不够清楚,所以才产生了困惑。
可以这样,先在循坏体外面生成好随机数列,然后作为参数传入,到了循环体内部再按顺序取,即使这样也比每循环一次new一个random效率要高
Console.WriteLine(Now.ToString("mm:ss.fffffff"))
Dim r1 As New Random()
For i As Integer = 0 To 100000
Dim index As Integer = r1.Next(10)
Next
Console.WriteLine(Now.ToString("mm:ss.fffffff"))
For i As Integer = 0 To 100000
Dim r2 As New Random(Guid.NewGuid().GetHashCode())
Dim index As Integer = r2.Next(10)
Next
Console.WriteLine(Now.ToString("mm:ss.fffffff"))
Dim r3 As New Random()
Dim l As New List(Of Integer)
For i As Integer = 0 To 100000
l.Add(r3.Next(10))
Next
For Each j As Integer In l
Dim index As Integer = j
Next
Console.WriteLine(Now.ToString("mm:ss.fffffff"))
输出:
57:38.0936095
57:38.0975157
57:38.9813048
57:38.9881407
随机数都是这样的,利用很长的伪随机序列来模拟随机数,同一时间(或相隔非常短时
间)初始化的Random实例是相同的,同样,如果next的间隔过短,也会产生运行时固定
值,调试时随机值的情况。
如果这样写两行代码
Random r1 = new Random();
Random r2 = new Random();
那么r1和r2则无区别
所以在使用Random类的时候要特别注意实例化的代码位置~
【 在 KilltheThree (.Net菜鸟) 的大作中提到: 】
: 今天下午在调试程序时,发现随机函数生成的随机数总是一个值,而单步跟踪的时候又能够出现随机的效果,一直很奇怪。代码大致如下所示:
: for(int i=0;i<10;i++)
: {
: ...................