跨平台随机可重复性

时间:2018-08-20 10:47:05

标签: android c++ ios windows random

我需要使用随机函数,还要在不同的设备(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;
}

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

Your seed produced: 1125387415
10 6 8 1 7 2 4 3 5 9

iOS的输出:

Your seed produced: 1125387415
9 1 4 6 7 8 5 3 10 2

为什么我得到不同的结果? 操作系统本身是否还有其他依赖关系? 如何使它跨平台工作?

2 个答案:

答案 0 :(得分:5)

std::mt19937严格defined by the standard,并且没有平台特定/实现定义的行为的余地,您的问题不在这里。

问题出在std::shuffle上,它根本不会says how使用随机数生成器,只是使用

不幸的是,这意味着,如果您想要可重复的改组行为,则可能需要implement your own

答案 1 :(得分:0)

std::shuffle函数的第三个参数已更改。它是一个函数对象,应返回[0,n)范围内的值。这意味着您可以传递std::uniform_int_distribution。现在,它需要一个像std::mt19937这样的随机位源。您的图书馆希望哪个?