C# 4.0 随机字符串生成器产生相同结果的问题
我使用随机字符串生成器,基于此: 每隔一段时间,它会生成一个20个字符的len字符串,如下所示 aaaaaaaa当它需要生成一个包含随机字符的20个字符的len字符串时(例如63tsrvvbvdjimnowneb5l),就像C#random对象在20次迭代中每次返回值0一样C# 4.0 随机字符串生成器产生相同结果的问题,c#-4.0,random,C# 4.0,Random,我使用随机字符串生成器,基于此: 每隔一段时间,它会生成一个20个字符的len字符串,如下所示 aaaaaaaa当它需要生成一个包含随机字符的20个字符的len字符串时(例如63tsrvvbvdjimnowneb5l),就像C#random对象在20次迭代中每次返回值0一样 public static string GetRandomAlphaNumericString(int charCount) { var result = new string( Enumerable.R
public static string GetRandomAlphaNumericString(int charCount)
{
var result = new string(
Enumerable.Repeat(CHARS, charCount)
.Select(s =>
{
var nxt = SHARED_RANDOM.Next(s.Length);
var rval = s[nxt];
return rval;
})
.ToArray());
return result;
}
const string CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
public static Random SHARED_RANDOM = new Random(Guid.NewGuid().GetHashCode());
这对我来说毫无意义,我可以在这个发电机里监督什么?生成器工作正常,但偶尔,很少,它会像这样在短时间内生成一个打击AAAAAAAAA字符串
我在代码中没有看到bug,所以对我来说这是两件事情中的一件,或者C#Random对象在某些情况下表现得很滑稽,在短时间内返回0,或者在短时间内,CHARS const字符串在程序集中从“abcdefghijklmnopqrstuvwxyzabdefghijklmnopqrstuvxyzo123456789”更改为“a”
我不敢相信这可能是上述任何一种情况,我更愿意相信我在监督一些事情。你看到或想象过这怎么可能发生吗
更新日期:2017年10月23日
编写了一个测试例程,因此如果GetRandomAlphaNumericString生成邪恶的aaaaaa字符串,它将抛出一个错误,但之前会记录一个快速报告
该报告在一行中生成3个随机数,并将其添加到日志中:
SHARED_RANDOM.Next(20);
SHARED_RANDOM.Next(20);
SHARED_RANDOM.Next(20);
产生的3个数字是0,不错吧
这告诉我问题不在于GetRandomAlphaNumericString,而在于随机对象本身。
有某种破坏导致对象返回这些结果,所以基本上它可以是任何东西 我相信这是因为你的静态随机变量改变它,它可能会工作你的应用程序有多线程
Random
不是线程安全的。对于其他读者,OP在这里找到了问题的解决方案。TL;博士;-通过跨多个线程共享静态随机,RNG可能会中断,导致其返回0。Random不是线程安全的。