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
}
为了测试,我需要可重现的随机数。随机性并不那么重要。
目前我正在设置一个种子 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
}