为什么是C#方法生成的重复随机字符串

时间:2012-05-28 13:05:41

标签: c#

以下方法生成具有给定长度的随机字符串。

连续执行两次时,会给出相同的字符串。是否有人能够阐明为什么会这样?

 public static string GenerateRandomString(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();
        }

4 个答案:

答案 0 :(得分:8)

您没有正确使用Random

在紧急循环中调用GenerateRandomString时,最终会多次播种到相同的值。

我建议在Jon Skeet的C#深度网站上阅读Random numbers

以下是获取Random实例的建议方法:

using System;
using System.Threading;



public static class RandomProvider
{    
    private static int seed = Environment.TickCount;

    private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
        new Random(Interlocked.Increment(ref seed))
    );

    public static Random GetThreadRandom()
    {
        return randomWrapper.Value;
    }
}

答案 1 :(得分:2)

创建随机对象静态

public class MyClass
{
   public static Random rand = new Random();

   public int MyMethod()
   {
       return rand.Next() % 10 + 1;
   }
}

随机适用于System.DatTime.Now.Ticks

如果我们喜欢这个

Random rand = new Random();

内部以

发生
Random rand = new Random(System.DateTime.Now.Ticks);

想一想系统时间中唯一不恒定的想法就是系统时间。

当使用Random类时,将其对象设置为一次并使用其方法Next()。当在循环内创建随机对象时,您会在循环中找到这种情况。

在你的代码中,它们是一个接一个地创建的,它们是由相同的Ticks种子值创建的。

创建随机对象静态然后它们将不相同。

答案 2 :(得分:1)

连续两次执行快速? Random的种子是时间依赖的,所以如果你正在测试programmaticaly,这可能会发生。我将其他对象创建一次,然后在方法中引用它。

答案 3 :(得分:1)

Random对象移到方法之外,以便在重复调用时使用相同的对象。

static Random random = new Random();

现在你遇到的问题是Random类使用当前时间作为其种子值,因此如果它快速连续创建两次,则两者将具有相同的种子,因此产生相同的随机字符串。