以下方法生成具有给定长度的随机字符串。
连续执行两次时,会给出相同的字符串。是否有人能够阐明为什么会这样?
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();
}
答案 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
类使用当前时间作为其种子值,因此如果它快速连续创建两次,则两者将具有相同的种子,因此产生相同的随机字符串。