首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机字符串

生成随机字符串
EN

Stack Overflow用户
提问于 2009-10-15 14:31:12
回答 11查看 27K关注 0票数 21

可能重复: c#随机串发生器

我需要生成一个具有给定长度的随机字符串。到目前为止这是我的密码。问题是,随机字符串每次都像"RRRRRR“或"SSSSS”一样。就在我重新启动应用程序时,字母发生了变化。我需要像"asrDvgDgREGd“这样的东西

代码语言:javascript
复制
    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;
    }
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-10-15 14:34:07

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

随机对象将产生一个“伪随机”数,基于从“种子”数开始的数学进展。如果每次将随机对象初始化为相同的种子,则实际上可以得到相同的“随机”数字序列。

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

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

票数 28
EN

Stack Overflow用户

发布于 2009-10-15 14:37:17

您可以省去麻烦,使用Membership.GeneratePassword方法。本质上是做你想做的事。

用法:

代码语言:javascript
复制
int passwordLength = 5;
int alphaNumericalCharsAllowed = 2;
string random = Membership.GeneratePassword(passwordLength, alphaNumericalCharsAllowed);

为了提高可读性,您可以将其封装在帮助器方法中:

代码语言:javascript
复制
private string GenerateRandomString(int length, int alphaNumericalChars)
{
      return Membership.GeneratePassword(length, alphaNumericalChars);
}
票数 20
EN

Stack Overflow用户

发布于 2009-10-15 14:34:18

不要在每次迭代中创建一个新的Random实例--这将用当前时间(以毫秒为单位)为每个实例的种子,这显然不太可能在迭代之间发生变化。

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

试试这个:

代码语言:javascript
复制
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的一部分,但是现在我倾向于使用线程本地版本,并在适当的情况下将它传递到链中。总有一天我会把它作为MiscUtil的另一种选择.

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1572733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档