DooIT

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  47 随笔 :: 16 文章 :: 1376 评论 :: 27 引用
一直以来,用System.Random都使用的好好的,每次随机的数字都几乎很满意。如下代码
System.Random r = new Random();
int s = r.Next();

但是当我在做项目时,突然遇到一个大量使用随机数的时候,有时候产生的随机数很不随机,经常前后的随机数字都是一样的。到底怎么回事?

google了很久使用以下代码

System.Random r = new Random(uncheck((int)DateTime.Now.ticks));
int s = r.Next();

效果也一样,查阅了MSDN,发现Random()默认就是使用时间作为随机发生器的种子的,在大量使用随机数的时候,ticks还没来得及改变,众所周知,现在我们常用的随机发生器都是伪随机数字,是需要种子的,在种子一样时,产生的随机序列是一样的,因此随机数也就不随机了。

找到了问题,我们对症下药,再每次取随机数之前,我们暂停一毫秒

System.Threading.Thread.Sleep(1);

这样,我们每次的随机种子都不一样了,这样得出的随机数会更随机。

完整代码:

        System.Random random = new Random();
        
        System.Threading.Thread.Sleep(
1);

        
int serial = random.Next();
posted on 2007-07-07 16:24 ttyp 阅读(487) 评论(3)  编辑 收藏

评论

#1楼  2007-07-07 17:43 culturenet      
可以试一试 System.Security.Cryptography.RNGCryptoServiceProvider 。这个不错的。当然性能就没有 System.random 快了。

  回复  引用  查看    

#2楼  2007-07-07 17:48 culturenet      
MSDN中:

如果需要通过编程生成加密密钥,可以使用 RNGCryptoServiceProvider 创建密钥和初始化向量,而不用 Random 类。与 Random 类不同,RNGCryptoServiceProvider 创建的是密码强度符合 FIPS-140 的随机数。以下代码说明了如何使用这一函数。

using System.Security.Cryptography;
. . .
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] key = new byte[keySize];
rng.GetBytes(key);


  回复  引用  查看    

#3楼 [楼主] 2007-07-08 15:38 ttyp      
@culturenet
多谢你提供的一个方向,不过我的random够用了
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: