gpt4 book ai didi

c++ - RNG 和全局变量规避

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:46 24 4
gpt4 key购买 nike

我在想这个问题。我听说全局变量不好,它们会损害代码的可维护性、可用性、可重用性等。但在这种情况下,我还能做什么呢?也就是说,我有一个“伪随机数生成器”(PRNG),正如人们所知,它们涉及一种内部状态,每次生成新的随机数时都会发生变化。不过这好像是那种需要全局化的东西!或 RNG 类的“静态”成员,但本质上是全局变量!全局变量不好!

那么,我能做什么呢?显而易见的事情是有这样的东西(真的精简了):

class RNG {
private:
StateType state; // this is the thing one may be tempted
// to make "static", which ruins the
// whole idea
public:
RNG(); // constructor seeds the RNG
~RNG();
int generateRandomInt();
};

但是如果我们每次在某个函数或类中需要一个随机数时都需要创建一个实例,那么我们需要播种那么好。使用时钟可能不起作用,因为如果创建的两个“RNG”类型的实例靠得太近怎么办?然后他们得到相同的种子并产生相同的随机序列。不好。

我们还可以创建一个主 RNG 对象并使用指针传递它(而不是将其设为全局对象,这会使我们回到方 block 1),以便需要随机数的类获得指向其中 RNG 对象的指针.但是后来我遇到了一个问题,涉及将这些对象保存到磁盘或从磁盘加载这些对象——我们不能只为每个实例“保存 RNG”,因为我们只有一个 RNG 对象。我们必须改为将 RNG 传递到加载例程中,这可能会为这些例程提供与不使用 RNG 的其他对象不同的参数列表。如果,例如,这将是一个问题。我们想为我们可以加载/保存的所有内容使用一个通用的“可保存”基类。那么该怎么办?消除常见的“可保存”基础,并仅采用关于如何制作加载/保存例程的约定(但这本身不是很糟糕吗?哎呀!)?

最好的解决方案是什么,既可以避免全局变量对可维护性的敌对问题,又不会遇到这些新问题?

或者实际上可以在这里使用全局变量吗,毕竟,“rand()”内置函数就是这样工作的?但后来我听到脑海深处有个小东西在说“但是......但是但是但是,全局变量很糟糕!很糟糕!”从我读到的内容来看,似乎有充分的理由认为它们不好。但似乎避免它们会产生新的困难,比如这个。例如,避免全局似乎比避免“goto”更难。

最佳答案

你的不情愿是有道理的。例如,您可能想用另一个生成器来代替测试,它吐出一个包含一些边缘情况的确定性序列。

Dependency Injection是避免全局变量的一种流行方法。

关于c++ - RNG 和全局变量规避,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com