在探讨随机数与决策记忆时,我们不可避免地要提及stdlib与time这两个关键库。它们为随机数生成提供了坚实的基础。
_mem,一个记忆数组,记录着各种决策与结果。其下标分别为回合、胜场、平场以及负场。具体来说,_mem[i][m]表示在对手出i而我们出j的情况下,整个局面如何演变。而_mem[i][m]._all则反映了这一状态的出现次数。至于_mem[i][m]._list[k],它则记录了对手出k的次数。
在初始化之后,我们引入了GenRand用于随机数撒种,而GenMem则如之前所述,扮演着关键角色。为了避免模数为零的尴尬,同时确保对后续影响最小,我们选择了n=3,并将a1、a2、a3均设为1。
至于一些看似无用的调试代码,实际上它们在某些情况下可能帮助我们更好地理解程序运行过程。
玩法方面,程序会接收对手的决策输入。由于后续可能需要对输入进行修改或汉化,我们特意将其封装为一个函数或方法,以便更灵活地处理。
核心策略在于通过(rand mod k) + 1来模拟对手的选择。这里的k值在1-a1之间变化。例如,当我们认为对手会出1时,我们就选择出2,以此类推。值得注意的是,我们的选择区间是1-a1、a1-a1+a2直至n,而非简单的1-a1、1-a2、1-a3。这要求我们使用一个额外的变量add来记录上一次决策的起点,从而确保每次决策都能准确落在正确的区间内。
在每次判断后,由于存在return语句,我们无需重复判断。一旦从第一个判断中退出,即可认为k>a1;同样地,从第二个判断中退出后,即可认为k>a1+a2。因此,我们可以确定k一定位于第三个区间内。
最后,根据当前的决策函数,我们只需从记忆数组中取出(Decision)上次的决策结果,并在刷新后放回原处。主程序则按顺序调用这些函数即可。
大致内容如上所述。如有任何错误、优化建议或疑问,请随时提出。您可以通过以下方式与我联系:WeChat:wxid_ffe28hxx677f32。(其实我更希望能结识更多行业内的前辈。)