如何在两个不同的环境中生成相同的随机数?
how to generate the same random number in two different environments?
我编译了完全相同的代码,在两个不同的环境(Linux 和 visual studio)中生成随机数。但是我注意到输出是不同的。上网查了下才知道是两种实现方式生成的随机数不同。但是我需要 Linux 来生成与 visual studio.
生成的随机数相同的随机数
那么,如何让两个不同的环境(Linux和visual studio)产生相同的随机数。任何想法。
我的代码:
void mix_dataset(array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
// size_t len = array_X_dataset.size();
// for (size_t i = 0; i < len; ++i) {
// size_t swap_index = rand() % len;
mt19937 engine;
engine.seed(3);
for (size_t i = 0; i < 5430; ++i) {
size_t swap_index = engine() % 5430;
if (i == swap_index)
continue;
array<int, 20> data_point{ };
data_point = array_X_dataset[i];
array_X_dataset[i] = array_X_dataset[swap_index];
array_X_dataset[swap_index] = data_point;
int Y = array_Y_dataset[i];
array_Y_dataset[i] = array_Y_dataset[swap_index];
array_Y_dataset[swap_index] = Y;
}
}
int main(){
srand(3);
mix_dataset(array_X_dataset, array_Y_dataset);
}
由于两个平台提供的标准库函数实现不同,您需要确定一个 PRNG,其给定相同种子的输出在两个平台上相同。
无论如何,当涉及到 rand
公开的 PRNG 质量时,标准 C 提供的保证很少,严肃的应用程序应该远离它。
无论批评如何,使用 PCG 会更好,例如,因为您似乎不需要密码质量。
此外,避免
size_t swap_index = rand() % len;
因为随机性可能会受到影响。如果您选择的图书馆不提供替代方案,您可以改为使用拒绝抽样。
如果你想要一个已知算法的伪随机数,你必须用 C++ 显式地选择它们 library。
您不能使用 rand()
执行此操作,因为它会因 C 库实现而异。
请区分伪随机数生成器(将从同一种子生成相同序列)和随机数生成器,它们几乎不可能重合。
您可以使用 mersenne twister,它具有可重现的输出(已标准化)。
在 2 台机器上使用相同的种子就可以了。
#include <random>
#include <iostream>
int main()
{
std::mt19937 engine;
engine.seed(1);
for (std::size_t n = 0; n < 10; ++n)
{
std::cout << engine() << std::endl;
}
}
你可以在这里验证一下,https://godbolt.org/z/j5r6ToGY7,只是select不同的编译器并检查输出
我编译了完全相同的代码,在两个不同的环境(Linux 和 visual studio)中生成随机数。但是我注意到输出是不同的。上网查了下才知道是两种实现方式生成的随机数不同。但是我需要 Linux 来生成与 visual studio.
生成的随机数相同的随机数那么,如何让两个不同的环境(Linux和visual studio)产生相同的随机数。任何想法。
我的代码:
void mix_dataset(array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
// size_t len = array_X_dataset.size();
// for (size_t i = 0; i < len; ++i) {
// size_t swap_index = rand() % len;
mt19937 engine;
engine.seed(3);
for (size_t i = 0; i < 5430; ++i) {
size_t swap_index = engine() % 5430;
if (i == swap_index)
continue;
array<int, 20> data_point{ };
data_point = array_X_dataset[i];
array_X_dataset[i] = array_X_dataset[swap_index];
array_X_dataset[swap_index] = data_point;
int Y = array_Y_dataset[i];
array_Y_dataset[i] = array_Y_dataset[swap_index];
array_Y_dataset[swap_index] = Y;
}
}
int main(){
srand(3);
mix_dataset(array_X_dataset, array_Y_dataset);
}
由于两个平台提供的标准库函数实现不同,您需要确定一个 PRNG,其给定相同种子的输出在两个平台上相同。
无论如何,当涉及到 rand
公开的 PRNG 质量时,标准 C 提供的保证很少,严肃的应用程序应该远离它。
无论批评如何,使用 PCG 会更好,例如,因为您似乎不需要密码质量。
此外,避免
size_t swap_index = rand() % len;
因为随机性可能会受到影响。如果您选择的图书馆不提供替代方案,您可以改为使用拒绝抽样。
如果你想要一个已知算法的伪随机数,你必须用 C++ 显式地选择它们 library。
您不能使用 rand()
执行此操作,因为它会因 C 库实现而异。
请区分伪随机数生成器(将从同一种子生成相同序列)和随机数生成器,它们几乎不可能重合。
您可以使用 mersenne twister,它具有可重现的输出(已标准化)。 在 2 台机器上使用相同的种子就可以了。
#include <random>
#include <iostream>
int main()
{
std::mt19937 engine;
engine.seed(1);
for (std::size_t n = 0; n < 10; ++n)
{
std::cout << engine() << std::endl;
}
}
你可以在这里验证一下,https://godbolt.org/z/j5r6ToGY7,只是select不同的编译器并检查输出