使用静态方法生成随机数是一种好习惯吗?

Ant*_*ony 1 .net c# random static

我编写了以下用于生成随机数floatdouble数字的代码.

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和生成随机数的方法吗?

我的程序在很大程度上依赖于这些方法,所以我想确保生成的数字确实是随机的.这些发生器被许多物体使用但不同时使用.

Tam*_*red 5

没有理由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)