【发布时间】:2016-11-16 08:46:10
【问题描述】:
我对编程很陌生,希望这个问题不会太麻烦。作为我通过 YouTube 使用的视频教程系列的一部分,它使用一系列挑战让学生使用该语言的部分内容来解决预定义的问题。在这种情况下,它制作了一个简单的 Humans Vs Skeleton “1D Combat Simulator”(链接: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 问题似乎是它的使用问题,而不是任何头文件或库文件中的问题。 :Issues with c++ 11 mersenne_twister_engine class :How to run Mersenne Twister inside a function? :mt19937 and uniform_real_distribution :Why do I get the same sequence for every run with std::random_device with 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);是一个函数声明,我猜它可能不是你想要的。
标签: c++ random mersenne-twister