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

本文关键字:结果 函数 返回 随机 字符串 | 更新日期: 2023-09-27 18:12:21

我是c#的新手,我有一个代码,调用相同的函数3次,返回一个随机字符串。由于某种原因,我的代码总是返回相同的字符串。请帮助。

        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());
    }

观察样本输出:AXCFSDRGAXCFSDRGAXCFSDRG

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

您正在构造三个独立的Random对象,而不是重用单个Random对象(这将是更好的实践)。

随机对象,如果没有提供种子,将使用当前时间作为种子。在本例中,randomString()方法的返回速度非常快,以至于所有三个Random对象都获得相同的种子,从而获得相同的输出序列。

基于此SO答案。

每次执行new 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);
    }
}

使用RNGCryptoServiceProvider类:

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

查看RNGCryptoServiceProvider:生成[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);
        }
    }

每次结果都不一样