• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

用C#得到真正的随机数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

关于生成随机数,有以下几个可以选择的方案:

1) System.Random

2) xdev所提到的System.Security.Cryptography.RNGCryptoServiceProvider

3) 直接调用Platform SDK中的CryptGenRandom()函数。

其中,和1)相比,2)和3)可以被作为真正的随机数来使用。

System.Random是最简单最常用的随机数发生器,如果用系统当前时间做种子,基本上可以做到"伪"随机。但是用System.Random得到的随机数的安全性是不高的,用户完全可以用一些方法根据已经生成的随机数序列预测出下一个随机数的值。在一些用到加密的场合,随机数序列可被预测会导致很严重的漏洞,例如曾经有扑克牌游戏网站由于使用了可以被预测的随机数发生器来实现随机发牌而导致的安全漏洞(参见http://www.cigital.com/news/gambling.html)。

如果需要更"随机"的随机数,应该使用System.Security.Cryptography.RNGCryptoServiceProvider或者Platform SDK中的CryptGenRandom()函数。System.Security.Cryptography.RNGCryptoServiceProvider是对System.Security.Cryptography.RandomNumberGenerator接口的一个实现,提供了获得可用于加密的随机数序列(cryptographically strong random values)的方法。

Platform SDK中的CryptGenRandom()函数也是一个非常好的随机数发生器,他在生成随机数的时候不单单用到了系统时间,还用到了Process ID、Thread ID以及大量系统信息。当然,CryptGenRandom()和RNGCryptoServiceProvider在提供更好的随机数的同时,不可避免的是速度方面的性能要逊于System.Random。

Hogwarts - S(u)ddenly dis@ppeared...

-

本贴子以"现状"提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。

为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。

我用的是系统的默认种子值,每次取出10个,好像没有你说得问题啊,我每次重新运行程序时得到的都不一样啊。程序如下:

    Random rr=new Random();

    for(int i=0;i<10;i++)

       Console.WriteLine(rr.Next().ToString()+"\n");

其实以默认的种子值也是以时间作为种子的

 


|订阅


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#动态给Word文档填充内容发布时间:2022-07-13
下一篇:
C#线程从陌生到熟悉(4)发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap