gpt4 book ai didi

c++ - 如何在 for 循环中使用 random_engine 和 mt19937

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:59 39 4
gpt4 key购买 nike

我正在创建一个简单的 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;
}

当上面的代码被调用时,它只打印一条蛇。我试过一个非静态引擎,它仍然提供相同的输出。这是因为引擎需要重新播种吗?我还通过创建 2 个不同的引擎打印了 2 条蛇,但这似乎浪费了很多空间,如果我想要 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';
}

我读过 C++ generating random numbers in a loop using default_random_engine ,但它并没有完全回答我的问题。

最佳答案

首先,在这种情况下,您不需要多个随机数生成器(几乎不需要)。它也不需要是静态的。在您链接的问题中,他需要它是静态的,因为生成器位于一个被多次调用的函数中。每次调用该函数时,都会使用几乎相同的种子实例化生成器,从而生成几乎相同的数字。就这样

random_device rd;
mt19937 rng(rd());

这定义了一个随机数生成器 rng,其种子由 std::random_device 生成.您不需要更多它们,因为一个生成器可以生成无穷无尽的数字序列。

然后是分布。它们通过定义您希望生成数字的范围来工作。它们很轻,只存储一对数字。在您的情况下,您需要其中的 2 个。一个用于 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
}

关于c++ - 如何在 for 循环中使用 random_engine 和 mt19937,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976033/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com