下面这段代码为什么生成的随机数都是一样的,而加断点跟踪返回的随机数就正确。求各位高手帮忙private string makeRanFileName(int maxLen)
{
string strNewPass = null;
int whatsNext = 0;
int upper = 0;
int lower = 0;
int ranInt = 0;
string[] a = new string[10];
for(int i = 0 ; i < maxLen ; i ++)
{
Random ra = new Random();
whatsNext = ra.Next(0, 3);
if (whatsNext == 0)
{
upper = 90;
lower = 65;
}
else
{
upper = 57;
lower = 48;
}
ranInt = new System.Random().Next(lower, upper + 1);
strNewPass = strNewPass + Convert.ToChar(ranInt).ToString();
}
return strNewPass;
}
{
string strNewPass = null;
int whatsNext = 0;
int upper = 0;
int lower = 0;
int ranInt = 0;
string[] a = new string[10];
for(int i = 0 ; i < maxLen ; i ++)
{
Random ra = new Random();
whatsNext = ra.Next(0, 3);
if (whatsNext == 0)
{
upper = 90;
lower = 65;
}
else
{
upper = 57;
lower = 48;
}
ranInt = new System.Random().Next(lower, upper + 1);
strNewPass = strNewPass + Convert.ToChar(ranInt).ToString();
}
return strNewPass;
}
new Random(随机种子)
int value=rnd.Next(1, 100);
Random ra = new Random(DateTime.Now.Millisecond);
Random 的实例化放在循环外面
必须放到循环体外面。
因为随机数的种子一般是系统时间,而且是忽略了高精度部分的分返回值
private static int GetRandomSeed()
{
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32(bytes, 0);
}Random ra = new Random(GetRandomSeed());
支持楼上的,System.Random并不是真正意义上的随机数 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。