我正在学习如何在C++中生成随机数组.我正在使用std :: vector和std :: generate(我正在尝试使用现代惯用的C++ - 不确定我的表现如何).
我想要做的是将此函数公开给普通的旧C代码.如何从C中提供此功能?
代码如下.谢谢!
void RandomArray(std::vector<double> &data)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };
std::generate(data.begin(), data.end(), gen);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用该extern "C"语句使该函数可链接到C代码.
但是从我的C++版本到C版本工作我觉得更难,它会是这样的:
void RandomArray(std::vector<double> &data)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };
std::generate(data.begin(), data.end(), gen);
}
extern "C" void RandomArray(double* data, size_t size)
{
std::vector<double> v(size);
RandomArray(v);
std::copy(std::begin(v), std::end(v), data); // need to copy out
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会采取另一种方式,使C版本成为主要算法,并获得C++版本调用:
extern "C" void RandomArray(double* data, size_t size)
{
std::random_device rd{};
auto mtgen = std::mt19937{ rd() };
auto ud = std::uniform_int_distribution<>{ 1, 6 };
auto gen = [&ud, &mtgen](){ return ud(mtgen); };
std::generate(data, data + size, gen);
}
void RandomArray(std::vector<double>& data)
{
RandomArray(data.data(), data.size());
}
Run Code Online (Sandbox Code Playgroud)
每次调用函数时,如果不初始化随机生成器也会快得多.一种方法是制作随机发生器static.如果你需要线程安全,你也可以做到thread_local:
extern "C" void RandomArray(double* data, size_t size)
{
thread_local static auto mtgen = std::mt19937{std::random_device{}()};
auto ud = std::uniform_int_distribution<>{ 1, 6 };
std::generate(data, data + size, [&ud](){ return ud(mtgen); });
}
Run Code Online (Sandbox Code Playgroud)