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();
}
}