2

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

当连续执行两次时,给出相同的字符串。有没有人能够解释为什么会这样?

 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

4 回答 4

8

你没有Random正确使用。

当你在一个紧密的循环中调用你GenerateRandomString时,它最终会被多次播种到相同的值。

我建议阅读Jon Skeet 的 C# 深度站点中的随机数

以下是获取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;
    }
}
于 2012-05-28T13:07:07.353 回答
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 种子值创建的。

创建您的随机对象静态,然后它们将不一样。

于 2012-05-28T13:07:57.007 回答
1

连续执行两次有多?Random 的种子是时间相关的,因此如果您以编程方式进行测试,则可能会发生这种情况。我会在其他地方创建一次Random 对象,然后在方法中引用它。

于 2012-05-28T13:09:49.687 回答
1

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

static Random random = new Random();

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

于 2012-05-28T13:10:54.987 回答