我已编写以下代码来生成随机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;
}
}
}
我可以使用static
class
和方法生成随机数吗?
我的程序在很大程度上依赖于这些方法,所以我想确保生成的数字确实是随机的。这些发生器被许多物体使用,但不是同时使用。
答案 0 :(得分:5)
没有理由在静态上下文中使用Random
是一个问题, 但是 ,请记住(似乎你做过)< strong> Random
不是线程安全的 。
您选择做的是使用Thread
同步lock
。
然而,您可以创建一个使用ThreadStatic
或ThreadLocal
的随机生成器(better for that cause,这样您可以使用不同的种子懒洋洋地初始化实例),这样您就可以获得没有被要求锁定的表现。
此外,请确保使用不同种子为Random
初始化Thread
,因为它们可能会在您this回答的同时进行初始化:
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();
}
}