Mersenne Twister & 接收算法中的语义问题.h
Mersenne Twister & receiving Semantic Issue in the algorithm.h
我对编程很陌生,希望这个问题不会太麻烦。作为我通过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(,它都可能有用。
- 警告处理为错误这里有什么问题
- Xcode 语义问题引用或以前定义的代码
- Xcode(版本9.2(9C40B)):试图包括Boost时C 语义和链接器问题
- 由于libkern.h中的语义问题,Xcode Build失败
- 解析问题:预期的不合格的ID和语义问题:C 需要所有声明的类型说明符
- 二进制表达式的语义问题无效操作数("双精度"和"双精度")
- 将 Xcode 项目与 MathGL 链接时的语义问题
- 语义问题:调用'displayBoard'没有匹配函数
- xcode 构建错误:从指针到较小类型"int"的语义问题丢失了信息
- 语义问题 "Attempt to use a deleted function" 遇到使用 std::线程用法编译 c++ 代码
- 成功包含文件,现在处理语义问题
- 重载迭代器:c++语义问题
- 关于对象初始化语义的问题
- C++语法/语义问题:对Function和typedef关键字的引用
- C++Friend语法/语义问题
- 关于声明语义的几个问题
- C++ 语义问题:"'use of undeclared identifier 'balance'"
- Mersenne Twister & 接收算法中的语义问题.h
- C++11 移动语义行为特定问题
- 使用push_back时的语义问题