为什么我需要创建一个Random类的实例,如果我想创建1到100之间的随机数....就像
Random rand = new Random();
rand.Next(1,100);
Run Code Online (Sandbox Code Playgroud)
Random类是否有任何静态函数来做同样的事情?喜欢...
Random.Next(1,100);
Run Code Online (Sandbox Code Playgroud)
我不想不必要地创建一个实例
Kob*_*obi 34
最佳做法是Random在整个程序中创建单个实例并使用它 - 否则结果可能不是随机的.不创建静态函数会鼓励这种行为.
你不应该担心"不必要地创建一个实例",影响最多可以忽略不计 - 这就是框架的工作方式.
Pra*_*are 27
//Function to get random number
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
{
lock(syncLock) { // synchronize
return random.Next(min, max);
}
}
Run Code Online (Sandbox Code Playgroud)
它不是"不必要的",因为Random类在内部存储了一些状态.这样做是为了确保如果您.Next()非常快速地调用多次(在相同的毫秒或刻度或其他情况下),您仍然不会得到相同的数字.
当然,如果在您的情况下这不是问题,您可以始终将这两行代码合并为一行:
new Random().Next(1, 100);
Run Code Online (Sandbox Code Playgroud)
小智 5
来自MSDN:随机类(系统):
"随机数生成从种子值开始.如果重复使用相同的种子,则生成相同的数字序列.产生不同序列的一种方法是使种子值与时间相关,从而产生不同的序列. Random的新实例.默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,而其参数化构造函数可以根据当前时间的滴答数采用Int32值.但是,因为时钟具有有限分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象,创建随机数生成器,生成相同的随机数序列.以下示例说明了紧密连续实例化的两个随机对象生成相同的随机数序列. .."
你已经在这里得到了答案.重申正确的解决方案:
namespace mySpace
{
public static class Util
{
private static Random rnd = new Random();
public static int GetRandom()
{
return rnd.Next();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以打电话:
var i = Util.GetRandom();
Run Code Online (Sandbox Code Playgroud)
一切都在.如果你真的需要一个真正的无状态静态方法来生成随机数,你可以依靠a Guid.
public static class Util
{
public static int GetRandom()
{
return Guid.NewGuid().GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
它会慢一点,但可能比任何时候都要多Random.Next,至少从我的经验来看.
但不是:
new Random(Guid.NewGuid().GetHashCode()).Next();
Run Code Online (Sandbox Code Playgroud)
不必要的对象创建会使它变慢,特别是在循环中.
而从未:
new Random().Next();
Run Code Online (Sandbox Code Playgroud)
不仅它的速度较慢(在一个循环内),它的随机性......根据我不是很好......
最好的方法是有一个ThreadStatic Random实例:
[ThreadStatic] static Random random;
Random Get() {
if (random == null) random = new Random(Guid.NewGuid().GetHashCode());
return random;
}
Run Code Online (Sandbox Code Playgroud)
这样就解决了一切问题。
我不明白为什么 .NET Framework(以及地球上的任何其他框架)不使用这种精神。