这是生成随机字符的字符串的好办法? [英] Is this a good way to generate a string of random characters?

查看:138
本文介绍了这是生成随机字符的字符串的好办法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现这个片段,其产生的串码随机字符。



但有一个更优雅/更快/更可靠的方式做到这一点?这似乎依赖于这一事实的数字26-91是有效的字符定当前编码



  ///&下;总结> 
///生成具有给定长度
///℃的随机字符串; /总结>
///&下; PARAM NAME =大小>本串下的大小; /参数>
///< PARAM NAME =小写>如果为true,生成小写的字符串< /参数>
///<退货和GT;随机字符串< /回报>
私人字符串RandomString(INT大小,布尔小写)
{
StringBuilder的建设者=新的StringBuilder();
随机随机=新的随机();
字符CH;

的for(int i = 0; I<大小;我++)
{
CH = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble ()+ 65)));
builder.Append(CH);
}

如果(小写)
返回builder.ToString()ToLower将()。

返回builder.ToString();
}


解决方案

我宁愿通过在随机实例到方法 - 那么你可以多次,如果你需要生成大量快速连续随机字符串这是非常重要重复使用相同的实例。不过,我也想修改它有点反正:

 公共常量字符串LowerCaseAlphabet =abcdefghijklmnopqrstuvwyxz; 
公共常量字符串UpperCaseAlphabet =ABCDEFGHIJKLMNOPQRSTUVWXYZ;

公共静态字符串GenerateUpperCaseString(INT大小,随机RNG)
{
返回GenerateString(大小,RNG,UpperCaseAlphabet);
}

公共静态字符串GenerateLowerCaseString(INT大小,随机RNG)
{
返回GenerateString(大小,RNG,LowerCaseAlphabet);
}

公共静态字符串GenerateString(INT大小,随机RNG,串字母)
{
的char [] =字符新的char [大小]
的for(int i = 0; I<大小;我++)
{
字符由[i] =字母[rng.Next(alphabet.Length)];
}
返回新的字符串(字符);
}




  • 有没有需要你的时候使用StringBuilder知道最后的长度

  • 使用 Random.NextDouble()表示缺乏Random类的知识。 (特别是 Random.Next(INT,INT)

  • 在每次调用创建一个新的随机很可能会导致重复的字符串

  • 调用Convert.ToInt32和Convert.ToChar只用铸造

  • 下套管的之后的相比似乎毫无意义似乎比较难看采摘小写字母开始以

  • 提供了一个字母,从很多更灵活(带辅助方法在通常情况下)

$回暖b $ b

I found this snippet of code that generates a string of random characters.

But is there a more elegant/faster/more reliable way to do this? This seems to rely on the fact that the numbers 26-91 are valid characters given the current encoding.

/// <summary>
/// Generates a random string with the given length
/// </summary>
/// <param name="size">Size of the string</param>
/// <param name="lowerCase">If true, generate lowercase string</param>
/// <returns>Random string</returns>
private string RandomString(int size, bool lowerCase)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;

    for(int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
        builder.Append(ch);
    }

    if(lowerCase)
        return builder.ToString().ToLower();

    return builder.ToString();
}

解决方案

I'd prefer to pass the Random instance into the method - then you can reuse the same instance multiple times, which is important if you need to generate lots of random strings in quick succession. However, I'd also modify it somewhat anyway:

public const string LowerCaseAlphabet = "abcdefghijklmnopqrstuvwyxz";
public const string UpperCaseAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static string GenerateUpperCaseString(int size, Random rng)
{
    return GenerateString(size, rng, UpperCaseAlphabet);
}

public static string GenerateLowerCaseString(int size, Random rng)
{
    return GenerateString(size, rng, LowerCaseAlphabet);
}

public static string GenerateString(int size, Random rng, string alphabet)
{
    char[] chars = new char[size];
    for (int i=0; i < size; i++)
    {
        chars[i] = alphabet[rng.Next(alphabet.Length)];
    }
    return new string(chars);
}

  • There's no need to use a StringBuilder when you know the final length
  • Using Random.NextDouble() indicates a lack of knowledge of the Random class. (In particular Random.Next(int, int)
  • Creating a new Random on each call is likely to result in duplicate strings
  • Calling Convert.ToInt32 and Convert.ToChar seems ugly compared with just casting
  • Lower-casing afterwards seems pointless compared with picking lower case letters to start with
  • Providing an alphabet to pick from is a lot more flexible (with helper methods for common cases)

这篇关于这是生成随机字符的字符串的好办法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆