我正在创建一个简单的ASCII游戏,应该在屏幕上放置3条蛇。我试着用for循环打印所有3条蛇:
#include <iostream>
#include <conio.h>
#include <string>
#include <cstdlib>
#include <random>
#include <ctime>
using namespace std;
int main() {
char _levelTwo[20][20];
int minSizeRand = 1;
int maxSizeRand = 19;
//Random Enemie 1 Placement Engine
static random_device xSeed;
static mt19937 randGen(xSeed());
uniform_int_distribution<int> enemieX(minSizeRand, maxSizeRand);
static random_device ySeed;
static mt19937 randGen1(ySeed());
uniform_int_distribution<int> enemieY(minSizeRand, maxSizeRand);
int snakeRows = enemieX(xSeed);
int snakeCols = enemieY(ySeed);
//Tries to Print 3 Snakes
for (int i = 0; i < 3; i++) {
cout << "Snake x: " << snakeRows << endl;
cout << "Snake y: " << snakeCols << endl;
_levelTwo[snakeRows][snakeCols] = 'S';
}
cin.get();
return 0;
}当上面的代码被调用时,它只打印一条蛇。我试过一个非静态引擎,它仍然提供相同的输出。这是因为引擎需要重新安装吗?我还通过创建两个不同的引擎打印了两条蛇,但这似乎浪费了很多空间,如果我想要10条蛇,我需要10个不同的引擎。当使用for循环时,如何从相同的random_engine和mt19937获得不同的输出?
#include <iostream>
#include <conio.h>
#include <string>
#include <cstdlib>
#include <random>
#include <ctime>
using namespace std;
int main() {
char _levelTwo[20][20];
int minSizeRand = 1;
int maxSizeRand = 19;
//Random Enemie 1 Placement Engine
static random_device xSeed;
static mt19937 randGen(xSeed());
uniform_int_distribution<int> enemieX(minSizeRand, maxSizeRand);
static random_device ySeed;
static mt19937 randGen1(ySeed());
uniform_int_distribution<int> enemieY(minSizeRand, maxSizeRand);
int snakeRows = enemieX(xSeed);
int snakeCols = enemieY(ySeed);
//Sets placement of snake 1
_levelTwo[snakeRows][snakeCols] = 'S';
//Random Enemie Placement Engine
random_device xSeed2;
mt19937 randGen2(xSeed2());
uniform_int_distribution<int> enemieX2(minSizeRand, maxSizeRand);
random_device ySeed2;
mt19937 randGen3(ySeed2());
uniform_int_distribution<int> enemieY2(minSizeRand, maxSizeRand);
int snakeRows2 = enemieX2(xSeed2);
int snakeCols2 = enemieY2(ySeed);
//Sets placement of snake 2
_levelTwo[snakeRows2][snakeCols2] = 'S';
}我读过发动机,但它并没有完全回答我的问题。
发布于 2015-11-28 20:48:26
首先,在这种情况下,您不需要多个随机数生成器(您几乎不需要)。它也没有必要是静态的。在您所链接的问题中,他需要它是静态的,因为生成器在一个被多次调用的函数中。每次调用该函数时,都会用几乎相同的种子实例化生成器,使其生成几乎相同的数字。就这么做
random_device rd;
mt19937 rng(rd());这定义了一个具有由rng生成的种子的随机数生成器设备。您不需要更多的数字,因为一个生成器可以生成无尽的数字序列。
然后是分布。它们通过定义希望生成数字的范围来工作。它们是轻量级的,只存储一对数字。在你的情况下,你需要其中的两个。一个用于x坐标的分布,另一个用于y坐标(如果它们没有不同,您只需要一个,因为它们将定义相同的范围)。
uniform_int_distribution<int> xDist(minX, maxX);
uniform_int_distribution<int> yDist(minY, maxY);您可以像使用函数一样,通过将生成器传递到分发来生成数字。
int x = xDist(rng); //generator outputs one integer and updates its state to be able to generate the next one.
int y = yDist(rng);现在,您希望生成多个职位。生成坐标保持不变,但必须在循环中完成。在第一个代码中,您生成一个位置并使用它两次,结果将两个敌人放置在同一个位置。只需在循环中包含生成。
for (int i = 0; i < 2; i++) {
}
int x = xDist(rng);
int y = yDist(rng);
//do something with x,y
}https://stackoverflow.com/questions/33976033
复制相似问题