所以,我写了一个小和,从我最初以为,在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,所以它应该表现得更像熵源。如果你需要重复进行测试,使用随机构造函数重载,让你提供种子。相同的种子==相同的伪随机序列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top