首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在for循环中使用random_engine和mt19937

如何在for循环中使用random_engine和mt19937
EN

Stack Overflow用户
提问于 2015-11-28 20:20:49
回答 1查看 1.8K关注 0票数 5

我正在创建一个简单的ASCII游戏,应该在屏幕上放置3条蛇。我试着用for循环打印所有3条蛇:

代码语言:javascript
复制
#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获得不同的输出?

代码语言:javascript
复制
#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';
}

我读过发动机,但它并没有完全回答我的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-28 20:48:26

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

代码语言:javascript
复制
random_device rd;
mt19937 rng(rd());

这定义了一个具有由rng生成的种子的随机数生成器设备。您不需要更多的数字,因为一个生成器可以生成无尽的数字序列。

然后是分布。它们通过定义希望生成数字的范围来工作。它们是轻量级的,只存储一对数字。在你的情况下,你需要其中的两个。一个用于x坐标的分布,另一个用于y坐标(如果它们没有不同,您只需要一个,因为它们将定义相同的范围)。

代码语言:javascript
复制
uniform_int_distribution<int> xDist(minX, maxX);
uniform_int_distribution<int> yDist(minY, maxY);

您可以像使用函数一样,通过将生成器传递到分发来生成数字。

代码语言:javascript
复制
int x = xDist(rng); //generator outputs one integer and updates its state to be able to generate the next one. 
int y = yDist(rng);

现在,您希望生成多个职位。生成坐标保持不变,但必须在循环中完成。在第一个代码中,您生成一个位置并使用它两次,结果将两个敌人放置在同一个位置。只需在循环中包含生成。

代码语言:javascript
复制
for (int i = 0; i < 2; i++) {
}
    int x = xDist(rng);
    int y = yDist(rng);
    //do something with x,y
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33976033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档