Ant*_*ony 1 .net c# random static
我编写了以下用于生成随机数float和double数字的代码.
public static class Statics
{
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static double getRandomDouble(double min, double max)
{
lock (syncLock)
{
return random.NextDouble() * (max - min) + min;
}
}
public static float getRandomFloat(float min, float max)
{
lock (syncLock)
{
return (float)random.NextDouble() * (max - min) + min;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用static class和生成随机数的方法吗?
我的程序在很大程度上依赖于这些方法,所以我想确保生成的数字确实是随机的.这些发生器被许多物体使用但不同时使用.
没有理由Random在静态上下文中使用会是一个问题,但是,请记住(似乎你做的)Random不是线程安全的.
你选择做的是使用同步Threads lock.
但是,您可以创建一个使用ThreadStatic或的随机生成器ThreadLocal(这对于该原因更好,因此您可以使用不同的种子懒洋洋地初始化实例),这样您将获得不需要锁定的性能.
此外,请确保Random使用不同的种子初始化每个种子,Thread因为它们可能会在您在此答案中看到的同时进行初始化:
public static class StaticRandom
{
static int seed = Environment.TickCount;
static readonly ThreadLocal<Random> random =
new ThreadLocal<Random>(() => new Random(Interlocked.Increment(ref seed)));
public static int Rand()
{
return random.Value.Next();
}
}
Run Code Online (Sandbox Code Playgroud)