Mersenne Twister & 接收算法中的语义问题.h

Mersenne Twister & receiving Semantic Issue in the algorithm.h

本文关键字:语义 问题 算法 Twister Mersenne      更新时间:2023-10-16

我对编程很陌生,希望这个问题不会太麻烦。作为我通过YouTube使用的视频教程系列的一部分,该系列使用了一系列挑战,让学生使用语言的各个部分来解决预定义的问题。在这种情况下,它制作了一个简单的人类Vs骨骼"1D战斗模拟器"(链接:https://youtu.be/TH7plF4UT_E?list=PLSPw4ASQYyynKPY0I-QFHK0iJTjnvNUys(

导师Ben最初使用default_random_engine,但在他对视频的不满中表示,这是一个糟糕的实现,mt19937是一个更好的选择。(链接:https://youtu.be/JGwSEbnJGR0?list=PLSPw4ASQYyynKPY0I-QFHK0iJTjnvNUys;t=138(。

我搜索了Stack Overflow以及cplusplus.com和其他网站等。

我在这两个方面都找不到有用的提示。Mersenne Twister的大多数问题似乎都是它的使用问题,而不是任何头文件或库文件中的问题。:c++11 mersenne_twister_engine类的问题:如何在函数中运行Mersenne Twister?:mt19937和uniform_real_distribution:为什么每次使用std::random_device和mingw gcc4.8.1运行时,我都会得到相同的序列?

据我所知,我决定走mt19937的路线,用更多的熵进行更准确的随机生成。这对我正在进行的小项目来说可能有些过头了,我对更好的解决方案持开放态度。

我经常对大多数C++教程(视频或书籍(感到厌倦,因为它们教语法&词汇,但很少教授用语言解决问题。所以,即使我不理解它们,我也会跳过去玩,这样我就可以试着更好地理解它们。我对功能的理解,就其解剖结构和最佳使用而言,是薄弱的。课堂也是如此。尽管如此,我已经将met19937实现为一个函数,这样我就可以创建各种多面体模具模拟。(d4,d6,d8,d10(。

我的源代码没有任何错误,但是,algorithm.h文件有两个相同类型的错误,如下所示。

类型"std::__1::mersenne_twister_engine(long("不能在"::"之前使用,因为它没有成员

当我进入algorithm.h文件时(好像我知道自己在做什么(,这些是错误所在的代码行。

private:
typedef typename _Engine::result_type _Engine_result_type;
typedef typename conditional
    <

tatic _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min()
                                                  + _Working_result_type(1);

(分别在文件的第2844和2866行。(

这是我的源代码,我已经评论了很多项目,因为我试图在处理其他项目之前先处理一件事:

#include <iostream>
#include <string>
#include <random>
//#include <chrono>
//#include <ctime>
using namespace std;
/*
  // Simple Attack and Defense Attributes.
 int Agility = 40;
 int Attack =52;
 int MyAgility = 45;
 int MyAttack = 64;
*/
//Globals
mt19937 randomGenerator(time_t);
//default_random_engine randomGenerator(time_t);
//Function Protypes
void d4();
void d6();
void d8();
void d10();
void SuccessCheck();

int main()
{
    //Variables
    int MyWarriors;
    //int WarriorsAvailable = NULL;
    //int Skeletons = NULL;
    //int CharacterCount;
    /*
    int Attack;
    int Defense;
    int AxeDMG = 1;
    int SwordDMG = 2;
    int ShieldDEF = 1;
    //String Variables
    //Too Many Soldiers Requested
    char str1[150] = "I'm sorry Sire, we just don't have that many troops available.";
    char str2[150] = "No sir! We just can't manage that.";
    char str3[150] = "Oh! Our woes would not be so terrible, should we only have that many in our guard.";
    char str4[150] = "Have you been listening to my counsel? We just can't raise an army that size in such a short time.";
    char str5[150] = "Very well Sir, I suppose we'll perish until you can't give me a real answer.";
    //A Valid Amount of Soldiers Requested
    char str6[150] = "Great! I'll send them through the gates immediately!";
    char str7[150] = "YES! Through the forest, they'll ut down our foes!";
    char str8[150] = "By the Lord Almighty, they shall be vanquished!";
    char str9[150] = "They won't stand a chance!";
    char str10[150] = "No man or beast will rise against you again!";
    //Maybe Not Enough Soldiers Requested
    char str11[150] = "You may need a tad more men, Sire.";
    char str12[150] = "Perhaps, you'd like to join your men, just in case they need help?";
    char str13[150] = "I think we have a few more men you could send, Sire.";
    char str14[150] = "Oh yea, you'll have them quaking in their boots. Much like kittens and babies would. Perhaps you could spare a few more?";
    char str15[150] = "You can't say that I didn't warn you. Maybe send a few more men.";
    */

    //Random number of Skeletons!
    uniform_int_distribution<int> Skeletons (1, 3000);
    //Random number of Skeletons!
    uniform_int_distribution<int> WarriorsAvailable (1, 3000);
    //Invalid MySoldier Selection
    uniform_int_distribution<int> TooManySoldiers (1, 5);
    //Random number of Skeletons!
    uniform_int_distribution<int> RightNumSoldiers (6, 10);
    //Random number of Skeletons!
    uniform_int_distribution<int> ATadMoreSoldiers (11, 15);
    cout << "Sire! There are " << Skeletons(randomGenerator) << " marching toward the castle!" << endl << "We should send out our troops!" << endl;
    cout << "Our registry indicates that we have " << WarriorsAvailable << " who are combat ready!";
    cout << "How many warriors do wich to send out to battle?" << endl;
    cin >> MyWarriors;

    /*
    do {
        <#statements#>
    } while (<#condition#>); (MyWarriors > WarriorsAvailable)
        cout <<  << endl << "How many warriors woudl you like to send in to combat?";

    cout << "Yes, Sire! I will rally " << MyWarriors << " to do battle with our enemy, at once!" << endl << endl;

    */
    return 0;
}

//Dice Functions: Many of these functions cam from a Stack Overflow answer I found weeks prior to joining
void d4(){//function prints a randomly generated number
    //mt19937 randomGenerator(time_t);
    //auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
    uniform_int_distribution<int> d4Die (1, 4);
    int d4Roll = d4Die(randomGenerator); //the generated number is then set equal to an integer for functionality
    cout << d4Roll; //finally, the integer is printed to the screen
}

void d6(){//function prints a randomly generated number
    //mt19937 randomGenerator(time_t);
    uniform_int_distribution<int> d6Die (1, 6);
    int d6Roll = d6Die(randomGenerator); //the generated number is then set equal to an integer for functionality
    cout << d6Roll; //finally, the integer is printed to the screen
}
void d8(){//function prints a randomly generated number
    //mt19937 randomGenerator(time_t);
    uniform_int_distribution<int> d8Die (1, 8);
//the generated number is then set equal to an integer for functionality
    int d8Roll = d8Die(randomGenerator);
    cout << d8Roll; //finally, the integer is printed to the screen
}
void d10(){//function prints a randomly generated number
    //mt19937 randomGenerator(time_t);
    uniform_int_distribution<int> d10Die (1, 10);
    //the generated number is then set  equal to an integer for functionality
    int d10Roll = d10Die(randomGenerator); 
    cout << d10Roll; //finally, the integer is printed to the screen
}
void SuccessCheck(){//function prints a randomly generated number
    //mt19937 randomGenerator(time_t);
     //Success Check based on a percentile roll of (2d10) yielding a 1 - 100%
    uniform_int_distribution<int> SCDie (1, 100);
    //the generated number is then set equal to an integer for functionality
    int SCRoll = SCDie(randomGenerator); 
    cout << SCRoll; //finally, the integer is printed to the screen
}
//Combat Skill Modifier
uniform_int_distribution<int> CmbSklMod (1, 3);
//uniform_real_distribution<float> SucessCheck(0.0f, 1.0f);

您的问题是

mt19937 randomGenerator(time_t);

没有创建随机编号生成器。它声明了一个名为randomGenerator的函数,该函数接受time_t并返回mt19937

你需要做的是使用类似的东西

std::random_device rd
std::mt19937 randomGenerator{rd()};

这将创建PRNG,并使用rd中的初始值对其进行种子设定。如果你想要更好的种子,那么你可以使用

std::random_device rd;
std::seed_seq seed{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
std::mt19937 randomGenerator(seed);

上述技术来自这个答案中的bames53

谢谢Nathan!这实际上帮了不少忙。一旦我输入了第一个选项,我就收到了新的错误,下面将解释这些错误以及我是如何解决它们的。当然,我怀疑经验丰富的程序员会认为这是显而易见的P

错误 使用类模板uniform_int_distribution需要模板参数

使用代码解决:

uniform_int_distribution<int> Skeletons (randomGenerator);

错误

没有用于初始化uniform_int_distribution的匹配构造函数使用未声明的标识符Skeletons

使用代码解决:

uniform_int_distribution<int> Skeletons (1, 3000);

其他帮助来自:cppreference.com

最终工作代码段:

std::random_device rd;
std::seed_seq seed{rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()};
std::mt19937 randomGenerator(seed);

和在用

//Random number of Skeletons!
uniform_int_distribution<int> Skeletons (1, 3000);
//Random number of Available Warriors!
uniform_int_distribution<int> WarriorsAvailable (1, 3000);
//Invalid MySoldier Selection
uniform_int_distribution<int> TooManySoldiers (1, 5);
//Random number of Skeletons!
uniform_int_distribution<int> RightNumSoldiers (6, 10);
//Random number of Skeletons!
uniform_int_distribution<int> ATadMoreSoldiers (11, 15);

===============Messner Twister的可靠性=====================这就是为什么在上面的代码中大量使用rd((的原因。

有更好、更准确的方法吗?以下是关于Messner Twister,以及在更好地播种之前它是如何可预测的。

堆栈溢出

=====================间接相关===============================

根据上面发布的我的问题代码,我想我会链接我的骰子函数的来源。

http://www.cplusplus.com/forum/beginner/138382/

void d4(({//函数打印一个随机生成的数字uniform_int_distribution d4Die(1,4(;int d4Roll=d4Die(随机生成器(//然后将生成的数字设置为等于一个整数以实现功能cout<lt;d4滚动//最后,将整数打印到屏幕上}

==========================脚注=========================

谢谢你们两个的帮助。我希望这个答案能帮助其他对PRGN语言陌生的人克服这个或类似的问题。无论是战斗系统还是角色扮演游戏(RPG(,它都可能有用。