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

时间:2016-12-11 15:43:31

标签: c# .net 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;
        }
    }
}

我可以使用static class和方法生成随机数吗?

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

1 个答案:

答案 0 :(得分:5)

没有理由在静态上下文中使用Random是一个问题, 但是 ,请记住(似乎你做过)< strong> Random不是线程安全的

您选择做的是使用Thread同步lock

然而,您可以创建一个使用ThreadStaticThreadLocal的随机生成器(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();
    }
}