我的静态C#功能是玩游戏用我......完全以怪异!
-
26-09-2019 - |
题
所以,我写了一个小和,从我最初以为,在C#简单的方法。 此静态方法旨在被用作简单的密码建议发生器,以及将码如下所示:
public static string CreateRandomPassword(int outputLength, string source = "")
{
var output = string.Empty;
for (var i = 0; i < outputLength; i++)
{
var randomObj = new Random();
output += source.Substring(randomObj.Next(source.Length), 1);
}
return output;
}
我这样调用此函数:
var randomPassword = StringHelper.CreateRandomPassword(5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");
现在,这种方法几乎总是返回随机字符串,如“AAAAAA”,“BBBBBB”,“888888”等,在这里我想它应该返回一个字符串,如“A8JK2A”,“82mOK7”等。
然而,这里是奇怪的一部分;如果我把一个断点,并一步通过线本次迭代行,我得到的回报类型正确的密码。在其它情况下为100%,当Im不调试,它给我垃圾一样“AAAAAA”,“666666”,等。
这是如何实现?任何建议,非常感谢! : - )
顺便说一句,我的系统:Visual Studio 2010中,C#4.0,ASP.NET MVC 3 RTM项目瓦特/ ASP.NET开发服务器。还没有在任何其他环境中测试此代码。
解决方案
将声明为randomObj外循环。当你调试它,它每一次新的种子创建它,因为有足够的时间差的种子是不同的。但是当你没有调试,种子时间基本上是在每次循环迭代一样的,所以它的每一次给你相同的初始值。
和未成年尼特 - 每次一个字符添加到字符串时这是一个好习惯使用StringBuilder而不是这样的事情一个字符串,所以你不必重新初始化的内存空间。
在换句话说,这样的:
public static string CreateRandomPassword(int outputLength, string source = "")
{
var output = new StringBuilder();
var randomObj = new Random();
for (var i = 0; i < outputLength; i++)
{
output.Append(source.Substring(randomObj.Next(source.Length), 1));
}
return output.ToString();
}
其他提示
在行为,你所看到的是,因为Random
是基于时间,然后当你不调试它飞通过所有5次重复在同一时刻(或多或少)。所以你问的第一个随机数过相同的种子。当你调试,它需要足够长的时间,每次获得新的种子。
移动Random
的声明外循环:
var randomObj = new Random();
for (var i = 0; i < outputLength; i++)
{
output += source.Substring(randomObj.Next(source.Length), 1);
}
现在你的向前移动从一个随机种子强>代替的移动1个步骤就可以相同的随机种子5次强> 5个遥。
您是通过用新的时间相关的种子环路实例在每次迭代随机()的一个新实例。由于系统时钟和现代CPU速度的粒度,这几乎保证您重新启动伪随机序列一遍又一遍使用相同的种子。
尝试类似于以下,但如果你是单线程的,你可以放心地忽略锁():
private static Random randomBits = new Random() ;
public static string CreateRandomPassword(int outputLength, string source = "")
{
StringBuilder sb = new StringBuilder(outputLength) ;
lock ( randomBits )
{
while ( sb.Length < outputLength )
{
sb.Append( randomBits.Next( source.Length) , 1 ) ;
}
}
return sb.ToString() ;
}
您只实例化RNG一次。每个绘制位来自同一RNG,所以它应该表现得更像熵源。如果你需要重复进行测试,使用随机构造函数重载,让你提供种子。相同的种子==相同的伪随机序列。