-1

是的,我搜索了这种情况,但无法真正将其他人与此联系起来......(请不​​要抨击我......)

public Random Randomizer; 

string[] Monsters = { "Rat", "Giant Rat", "Skeleton", "Infected" };

public string DisplayKilled() 
{
    if (PlayerOne.Level <= 5) 
    {
        string randomMonster = Monsters[Randomizer.Next(1,2)]; // <= problemo

我在“字符串 randomMonster = Monsters[Randomizer.Next(1,2)];”处遇到错误 :对象引用未设置为对象的实例。我能做些什么来解决这个问题?

4

2 回答 2

6

您可以初始化变量。目前,您永远不会将其设置为一个值。它在这里声明

public Random Randomizer;

...但是您从不给它一个值,因此它将具有默认值null,这会导致在您取消引用它时引发异常。值得理解的是,这与它是关于随机性的事实无关......任何引用类型变量都会发生同样的情况,例如 astring或 a Stream

可以只使用:

private readonly Random randomizer = new Random();

...但还有其他缺点。(请注意,我已将其设为私有和只读 - 您应该几乎在任何地方都避免使用公共字段,并将其设为只读,除非您真的希望该值在对象的生命周期内发生变化。)

就缺点而言,有两个需要担心:

  • 如果您Random在很短的时间内使用无参数构造函数创建多个实例,它们中的许多可能共享相同的种子,这意味着它们将产生相同的随机数。
  • Random不是线程安全的 - 如果您使用来自多个线程的单个实例而没有任何锁定,您可以轻松进入每次只返回 0 的状态。

这两者一起特别讨厌......如果不是出于线程安全方面的考虑,那么只声明一个静态字段并为所有内容使用相同的实例是相当合理的。但是,如果您涉及多个线程,那将不起作用。同样,如果共享种子不是问题,那么每次需要时创建一个就可以了。

在 .NET中有一个关于随机性的页面,其中详细介绍了这个问题并提出了一些解决方法。

于 2013-04-06T21:54:35.367 回答
1
public Random Randomizer = new Random();
于 2013-04-06T21:54:20.143 回答