Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用静态方法生成随机数是一种好的做法吗?_C#_.net_Random_Static - Fatal编程技术网

C# 使用静态方法生成随机数是一种好的做法吗?

C# 使用静态方法生成随机数是一种好的做法吗?,c#,.net,random,static,C#,.net,Random,Static,我编写了以下代码,用于生成随机的浮点数和双数数字 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) {

我编写了以下代码,用于生成随机的
浮点数
双数
数字

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;
        }
    }
}
我使用
静态
和生成随机数的方法可以吗


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

没有理由在静态上下文中使用
随机
会是一个问题,但是请记住(您似乎已经这样做了)
随机
不是线程安全的

您选择的操作是使用
同步
线程
s

但是,您可以创建一个使用or的随机生成器(这样您就可以使用不同的种子惰性地初始化实例),这样您就可以获得不需要锁定的性能

另外,请确保为每个
线程使用不同的种子初始化
随机
,因为它们的初始化时间可能与您在回答中看到的时间相同:

公共静态类StaticRandom
{
静态int seed=Environment.TickCount;
静态只读线程本地随机=
new ThreadLocal(()=>new Random(联锁增量(参考种子));
公共静态int Rand()
{
返回random.Value.Next();
}
}

是,为什么不?如果你每堂课只需要一个随机生成器,你可以这样做;我看不出有什么问题。因为您使用的是锁,所以我假设您使用的是线程。如果你得到很多随机数,这可能会带来一个瓶颈。你的问题不是关于随机数生成器,而是关于静态方法,所以也许可以编辑你的问题和标题?你对“ok”的定义是什么?但不是同时定义的-那为什么要锁定?
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();
    }
}