跨平台随机再现性

sca*_*ner 5 c++ windows random android ios

我需要使用随机功能,但也可以在不同的设备(PC/iOS/Android)上重复使用.我正在运行此示例代码,以调整向量:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>

int main() {
    std::mt19937 generator(1337);
    std::cout << "Your seed produced: " << generator() << std::endl;
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::shuffle(v.begin(), v.end(), generator);
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两台不同PC(窗口)的输出:

Your seed produced: 1125387415
10 6 8 1 7 2 4 3 5 9
Run Code Online (Sandbox Code Playgroud)

iOS输出:

Your seed produced: 1125387415
9 1 4 6 7 8 5 3 10 2
Run Code Online (Sandbox Code Playgroud)

为什么我会得到不同的结果?是否存在与操作系统本身相关的其他依赖性?怎么可能让这个跨平台工作?

Pas*_* By 5

std::mt19937由标准严格定义,没有平台特定/实现定义行为的空间,你的问题不在这里.

问题是std::shuffle,这绝不是如何它应该使用随机数生成器,就即使用它.

不幸的是,如果你想要一个可重现的改组行为,你可能需要实现自己的.