关于c#:生成随机字符串

Generate random string

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
c# random string generator

我需要生成一个具有给定长度的随机字符串。这是迄今为止我的代码。问题是随机字符串就像"rrrrrr"或"sssss"每次都是同一个字母。就在我重新启动应用程序时,字母改变了。我需要"asrdvgdgregd"之类的东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public string GenerateChar()
    {
        Random random = new Random();

        return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString();
    }

    public string GenerateChar(int count)
    {        
        string randomString ="";

        for (int i = 0; i < count; i++)
        {
            nahodneZnaky += GenerateChar();
        }

        return randomString;
    }

尝试对整个字符串使用相同的随机对象,而不是为每个字符初始化一个对象。

随机对象将根据从"种子"数开始的数学级数生成"伪随机"数。如果每次将随机对象初始化为相同的种子,实际上可以获得相同的"随机"数字序列。

现在,当您在不指定种子的情况下初始化Random时,它将把计算机的时钟作为种子。在这种情况下,您可能做得足够快,以至于时钟没有从一个初始化更改为另一个初始化,并且您总是得到相同的种子。

最好在生成随机字符串的函数中初始化随机对象,并将其作为参数传递给generatechar函数,以便在随机对象的同一实例上多次调用NextDouble(),而不是在不同的实例上只调用一次。


您可以省去麻烦,使用membership.generatepassword方法。它本质上是做你所需要的。

用途:

1
2
3
int passwordLength = 5;
int alphaNumericalCharsAllowed = 2;
string random = Membership.GeneratePassword(passwordLength, alphaNumericalCharsAllowed);

对于可读性,也可以将其包装为一个助手方法:

1
2
3
4
private string GenerateRandomString(int length, int alphaNumericalChars)
{
      return Membership.GeneratePassword(length, alphaNumericalChars);
}


不要在每次迭代中创建EDOCX1的新实例(0),这将以毫秒为单位对每个实例进行种子设定,显然在两次迭代之间不会发生变化。

创建一个Random的实例,并将其传递到方法中。我还建议您不要在循环中连接这样的字符串,甚至不要创建这么多的字符串。另外,如果你使用Random.Next(int, int)使你的生活更容易。

试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public char GenerateChar(Random rng)
{
    // 'Z' + 1 because the range is exclusive
    return (char) (rng.Next('A', 'Z' + 1));
}

public string GenerateString(Random rng, int length)
{
    char[] letters = new char[length];
    for (int i = 0; i < length; i++)
    {
        letters[i] = GenerateChar(rng);
    }
    return new string(letters);
}

private static readonly Random SingleRandom = new Random();

public string GenerateStringNotThreadSafe(int length)
{
    return GenerateString(SingleRandom, length);
}

现在值得注意的是,Random不是线程安全的,所以如果您有多个线程,那么不应该只在静态变量中有一个Random实例而不加锁。有很多种方法可以解决这个问题——要么创建一个线程安全的Random子类,要么创建一组执行相同操作的静态方法,要么使用线程局部变量为每个线程创建一个实例。

作为miscUtil的一部分,我有一个StaticRandom类,但是最近我倾向于线程本地版本,并在适当的时候将其传递到链中。总有一天,我会把它作为另一个选项添加到miscutil中…


没什么特别的,只是很短。32和127是要生成的字符的最小和最大范围。

1
2
3
4
5
public static string GetRandomString(int length)
{
    var r = new Random();
    return new String(Enumerable.Range(0, length).Select(n => (Char)(r.Next(32, 127))).ToArray());
}

我知道这可能不是最好的解决方案,但我有点希望能够指定"允许"字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    private const int _defaultNumberOfCharacters = 8;
    private const int _defaultExpireDays = 10;
    private static readonly string _allowedCharacters ="bcdfghjklmnpqrstvxz0123456789";

    public static string GenerateKey(int numberOfCharacters)
    {
        const int from = 0;
        int to = _allowedCharacters.Length;
        Random r = new Random();

        StringBuilder qs = new StringBuilder();
        for (int i = 0; i < numberOfCharacters; i++)
        {
            qs.Append(_allowedCharacters.Substring(r.Next(from, to), 1));
        }
        return qs.ToString();
    }


http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx

1
2
3
4
string randomName = Path.GetRandomFileName();
randomName = randomName.Replace(".", string.Empty);

// take substring...


尝试静态

1
2
3
4
5
6
public string GenerateChar()
{
    static Random random = new Random();

    return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString();
}


根据字符串中所需的确切字符,您可能会发现Path.GetRandomFileName方法很有用。


您应该在方法之外初始化随机变量:

1
2
3
4
5
6
7
8
public Random random = new Random();

public string GenerateChar()
    {
       return Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))).ToString();
    }

...


从调用方法传递Random,并初始化它一次-您每次都用相同的种子重新输入随机生成器….


试试这个。

1
2
3
4
5
6
7
8
9
10
public string GetRandomString()
{
    int randomNumber = new Random().Next();
    string RandomString = string.Empty;
    for(int i = 0;i < randomNumber.ToString().Length;i++)
    {
        RandomString += ((char)Convert.ToUInt32(randomNumber.ToString()[i])).ToString();
    }
    return RandomString;
}