在静态类中使用随机数

本文关键字:随机数 静态类 | 更新日期: 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;
        }
    }
}