从返回随机字符串的函数中看到相同的结果

时间:2016-10-10 23:48:48

标签: c#

我是C#的新手,我有一个代码,它调用相同的函数3次,返回一个随机的sting。出于某种原因,我的代码始终返回相同的字符串。请帮忙。

        public static String randomString()
    {
        String chars = "QWERTYUIOPASDFGHJKLZXCVBNM";
        Random rand = new Random();
        String finalstring = null;

        for (int i = 0; i < 8; i++)
        {
            finalstring += chars[rand.Next(0, chars.Length - 1)];

        }
        return finalstring;

    }

    public void SecondTest()
    {

        Console.WriteLine(Class1.randomString());
        Console.WriteLine(Class1.randomString());
        Console.WriteLine(Class1.randomString());

    }

示例输出观察: AXCFSDRG AXCFSDRG AXCFSDRG

3 个答案:

答案 0 :(得分:1)

你正在构建三个独立的Random对象,而不是重用一个Random对象(这将是更好的练习)。

如果您不提供种子,随机对象将以当前时间播种。在这种情况下,您的randomString()方法返回得如此之快,以至于所有三个Random对象都获得相同的种子,从而得到相同的输出序列。

答案 1 :(得分:1)

基于此SO Answer

  

每次执行新的Random()时,都会使用时钟进行初始化。这个   意味着在紧密循环中,您可以多次获得相同的值。您   应该保留一个Random实例并继续使用Next   实例

//Function to get random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
    lock(syncLock) { // synchronize
        return random.Next(min, max);
    }
}

答案 2 :(得分:-1)

使用RNGCryptoServiceProvider类:

https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx

查看RNGCryptoServiceProvider: generate random numbers in the range [0, randomMax)

如果您在答案和以下内容中使用了扩展方法:

    public static String randomString()
    {
        String chars = "QWERTYUIOPASDFGHJKLZXCVBNM";
        Random rand = new Random();
        String finalstring = null;

        for (int i = 0; i < 8; i++)
        {
            finalstring += chars[GenerateRandomNumber(8)];

        }
        return finalstring;

    }

    public static int GenerateRandomNumber(int length)
    {
        using (var randomNumberGenerator = new RNGCryptoServiceProvider())
        {
            return randomNumberGenerator.GetNextInt32(length);
        }
    }

每次结果都不同。