【问题标题】:Produce a random seed to give to srand() - Not time(NULL)产生一个随机种子给 srand() - 不是时间(NULL)
【发布时间】:2016-07-13 13:39:11
【问题描述】:

我目前正在为推箱子游戏编写关卡生成程序。我经常使用 rand() 函数来生成每个级别,并且我认为一个不错的功能是让用户能够控制用于生成的种子,这意味着两个人可以输入同一个种子并且生成器会生成相同的关卡。

我一直在用

srand(std::time(NULL));

要生成运行良好的种子,我的程序将使用相同的种子生成相同的关卡,这没问题。然而,由于 std::time(NULL) 以毫秒为单位返回系统时间,它并没有给出非常有趣或多样化的数字,即它会产生 1476894985,然后下一个种子可能是 1476897904。

为了提供一些更有趣的种子,我尝试使用以下代码在 0 到 9999999999 之间创建一个随机种子:

typedef unsigned long long ull;

SokoGenerator::ull SokoGenerator::randomNumber(ull min, ull max, int divisor){
    ull number = rand() % (max - min + 1)+ min;

    while(number % divisor != 0){
        number = rand() % (max - min + 1) + min;
    }

    return number;
}


srand(std::time(0));
genSeed = randomNumber(0, 999999999); }
srand(genSeed);
//Generate Levels After this point

但这似乎产生了类似的结果,只是它们现在小了很多,即 45789、46389、47958。

有没有更好的方法来生成一个介于 0 和 9999999999 之间的良好随机种子以提供给 srand() 函数?

【问题讨论】:

  • 您有什么理由不能使用C++11 和附带的随机数生成器吗?
  • 如果rand()是一个线性同余生成器,相似的种子可以给出相似的初始值。解决方案是简单地运行生成器十几次,以使值差异更大。
  • 感谢大家的回复。 @Galik 我不知道 C++11 有随机数生成器,我会看看它们。
  • 我不明白你在做什么。如果您希望用户输入种子,为什么要生成随机种子?如果你想要一个随机种子,为什么不直接使用time(0)

标签: c++ random srand random-seed


【解决方案1】:

我最终使用 C++11 均匀分布随机数生成器给我一个介于 0 和 4,294,967,295 之间的值,如下所示:

std::default_random_engine generator;
std::uniform_int_distribution<int> distribution;
generator.seed(chrono::steady_clock::now().time_since_epoch().count());
random = distribution(generator);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多