std::srand/rand 和 libuuid uuid_generate 的副作用

Side-effect of std::srand/rand and libuuid uuid_generate

为了测试,我需要可重现的随机数。随机性并不那么重要。 目前我正在设置一个种子 std::srand(x) 并使用 std::rand() 来生成。正如预期的那样,具有相同种子的多个 运行 的数字始终相同。

对于其他一些部分,我需要 UUID。我使用 utils-linux libuuuid.

但是运行宁这个代码:

  std::srand(2);

  uuid_t uuid;
  
  int x = std::rand();
  uuid_generate(uuid);
  int y = std::rand();

y 在每个 运行 上都是不同的。

我已经尝试使用 uuid_generate_time,uuid_generate_time_safe 但这不会在多次调用时生成完全随机的 UUID:

d4e25820-92ca-11eb-9b39-f91e898522ad
d4e25821-92ca-11eb-9b39-f91e898522ad
d4e25822-92ca-11eb-9b39-f91e898522ad
d4e25823-92ca-11eb-9b39-f91e898522ad

还有其他方法可以实现吗?

As expected the numbers are always the same on multiple runs with the same seed.

直到他们不是。 rand()不需要使用某种算法。如果您升级 - 或者如果您在不同的平台上编译,它可能会改变。

正如您所注意到的,它也可能会受到其他功能的影响。

您可以改用 <random> 的生成器。这种生成器的每个实例都将完全不受您调用的其他函数的影响。

#include <uuid/uuid.h>

#include <iostream>
#include <random> // std::mt19937, std::uniform_int_distribution

auto& prng() {
    // Create a static seeded PRNG to use everywhere in the program
    // thread_local std::mt19937 instance(std::random_device{}());

    // A PRNG with hardcoded seed for testing:
    thread_local std::mt19937 instance(2);
    return instance;
}

int main() {
    uuid_t uuid;
    std::uniform_int_distribution<int> dist(0, 10000);

    int x = dist(prng());
    uuid_generate(uuid);
    int y = dist(prng());
    std::cout << x << '\n' << y << '\n'; // 4360 and 1851 - everywhere
}