日期:2014-05-19  浏览次数:20763 次

请问为什么多线程调用同一个方法生成的随机数很多时候会相同?谢谢~
难道是巧合?

------解决方案--------------------
随机数没有保重不会重复

如果需要唯一性 可参考 例如 GUID

或自己组合 例如 用执行程序的timespan+随机数+…… 等等的方法
------解决方案--------------------
好像Random类本身不是线程安全的,我遇到过多线程用Random,run了几天后出来的数字全是0
------解决方案--------------------
在极短的时间内,并使用相同的随机种子,结果就是这样的。

所以,同样的随机程序,调试的时候可能是正常的,因为等待的时间长,如果直接运行,
就会出现楼主所说的情况。
参考:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemrandomclasstopic.asp

=====================================================================
下面是我写的一段正常的程序,请参考:
/// <summary>
/// 获得一个随机字符
/// </summary>
/// <returns> </returns>
/// 0-9(48-57),a-z(97-122),A-Z(65-90)
private char GetRandomChar(int seed)
{
Random rdm = new Random((int)((int)DateTime.Now.Ticks + seed));
int rtype = rdm.Next(1, 3);
int ret = 0 ;

switch (rtype)
{
case 1: ret = rdm.Next(48, 57); break;
case 2: ret = rdm.Next(65, 90); break;
case 3: ret = rdm.Next(97, 122); break;
}

return (char)ret;
}


/// <summary>
/// 获得一个随机字符串
/// </summary>
/// <param name= "strlen "> </param>
/// <returns> </returns>
private string GetRandomString( int strlen )
{
string ret = " ";
char tmpchar = ' ' ;
for (int i = 0; i < strlen; i++)
{
tmpchar = GetRandomChar(i);
ret = ret + tmpchar.ToString();
}
return ret;
}