在静态类中使用随机数
本文关键字:随机数 静态类 | 更新日期: 2023-09-27 18:27:23
我在项目中创建了一个类来创建一个可以从其他表单执行的"全局方法"。我不确定这是否是一种糟糕的做法,但因为它是一个static class
,我不能(容易地)在其中使用Random
。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DefaultNamespace;
namespace LevelGenerator
{
public static class LevelGen
{
static int levelIndex = 0;
static DefaultNamespace.frmSplashScreen myMenu = new DefaultNamespace.frmSplashScreen();
public static void NewLevel()
{
levelIndex = rnd.Next(1, 6);
简而言之,我需要一个可以在任何地方调用的方法——这就是我使用static class
的原因——但它也需要有Random
。我想有很多方法可以做到这一点。
您可以添加一个静态构造函数来初始化类(静态)变量。或者,您可以简单地使用一个组合的初始化&声明声明。
所以要么显式:
namespace LevelGenerator {
public static class LevelGen {
static Random random;
static LevelGen() {
random = new Random();
}
// ...
}
}
或隐式:
namespace LevelGenerator {
public static class LevelGen {
static Random random = new Random();
// ...
}
}
与创建myMenu变量的方式相同
static DefaultNameSpace.frmSplashScreen myMenu = new DefaultNameSpace.frmSplashScreen();
您可以创建rnd变量以及
static Random rnd = new Random();
由于System.Random
是一个类,因此可以具有类型为Random
的字段或属性
public static Random Rng;
从那里,您可以从静态构造函数内联初始化,也可以要求调用initialize函数。最后,如果你想从用户那里收集种子值,我会推荐你,所以我将在下面演示
private static bool _randomReady = false;
public static Random Rng;
public static void SeedRandom(int seed)
{
// By not checking random ready here you will be able to reset the random later
Rng = new Random(seed);
_randomReady = true;
}
public static void NewLevel()
{
// By checking random ready, you can throw a more useful exception than NullReferenceException
if(!_randomReady)
throw new InvalidOperationException("Random Number Generation is not ready - call SeedRandom first!");
levelIndex = Rng.Next(1, 6);
使用实例管理,如:
public class MyRandom
{
static Random random;
public static Random Random
{
get
{
if (random == null)
random = new Random(DateTime.Now.Milliseconds)
return random;
}
}
}