【问题标题】:Same maze with same seed c++相同的迷宫相同的种子c ++
【发布时间】:2022-01-10 13:46:42
【问题描述】:

我编写了一个随机迷宫生成器,它完全可以工作。但是我想这样做,如果用户输入相同的种子(第三个命令行参数),它会生成相同的迷宫。我想知道最好的方法是什么,我应该将迷宫和种子输出到一个单独的文件中。调用种子时,比较两个种子,如果它们相同,则调用文件中相应的迷宫。或者你们建议我怎么做?

提前致谢!

编辑:这是使用我的随机器的代码

    std::mt19937 rng(std::random_device{}());
    Grid[yPos][xPos] = " ";
    std::vector<std::pair<int, int>> Directions{{
        {North, 0},
        {South, 0},
        {0, East},
        {0, West},
    }};
    // Shuffle vector
    for (int i = 0; i < 4; i++) {
        int j = i + rng() % (4 - i);
        std::swap(Directions[i], Directions[j]);
    }
    // Loop over a range of directions
    for(std::pair<int, int>& pair : Directions) {
        int toY = pair.first;
        int toX = pair.second;
        int y2 = yPos + toY * 2;
        int x2 = xPos + toX * 2;
        if(checkValid(y2, x2) && Grid[y2][x2] == "#") {
            Grid[yPos + toY][xPos + toX] = " ";
            carvePath(y2, x2);
        }
    }
}

【问题讨论】:

  • 您可能已经在以某种方式使用种子。只是不要发明一个新的 - 你目前如何生成你的“随机”迷宫?
  • 你能显示一些代码吗?你用的是什么随机发生器?没有这个,很难回答。 (您可以编辑您的问题并插入示例代码)
  • 我假设您正在使用某种 PRNG 来随机创建迷宫,并且您以某种方式播种该 PRNG?如果你用相同的种子播种 PRNG,它应该会生成相同的序列,这应该会给你同样的迷宫。
  • 因此,与其将std::random_device{}() 传递给rng 的构造函数,不如传递用户提供的种子(如果用户确实提供了种子)。这对于您的场景应该足够了
  • 你的种子目前是std::random_device{}()

标签: c++ maze seeding


【解决方案1】:

你不需要存储任何东西。

std::mt19937 是一个-随机数生成器。你在构造它时提供了一个种子,种子完全决定了它生成的随机数序列。

您应该只散列用户输入的种子并将散列传递给此构造函数,而不是使用random_device

那么用户输入的种子将完全决定你得到哪个迷宫。

您可以在此处查看从字符串生成的种子的示例:https://www.cplusplus.com/reference/random/mersenne_twister_engine/mersenne_twister_engine/

【讨论】:

  • 对不起,“将哈希传递给构造函数”是什么意思
  • 对你来说是好是坏,正如他们所说。答案中使用的语言对于 C++ 开发人员或任何 OOP 开发人员来说都不应该是陌生的。将std::random_device 替换为用户提供的种子。散列它是可选的,但建议使用。
  • @Jojo “我编写了一个随机迷宫生成器”是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多