5

我正在实现一些我希望尽可能便携的 C++ 代码。我想避免依赖需要 root 访问权限才能安装的库。此外,我宁愿避免在我的存储库中保留大型库的副本,并且我也不希望对库进行用户级安装(仅仅是因为我必须在多台计算机上手动安装它们。)

我想normal_distribution在我的项目中使用 Boost 的功能。我了解安装 Boost 的典型方法需要一个sudo apt-getsudo yum类型的命令,但我在运行此代码的系统上没有 root 访问权限。为了解决这个问题,我想知道是否可以简单地将 Boost 的normal_distribution.cppnormal_distribution.hpp的副本放在我的代码目录中,然后用这些文件编译/链接我的代码。这行得通吗?

读者可能想知道为什么我不只是使用normal_distributionTR1 或 C++11 中的实现。答案是我需要与一些仍然运行 g++ 4.1.x 的大学管理的集群保持兼容性,这些集群(至少根据我的经验)不支持<TR1/random>.

4

3 回答 3

3

我想BCP(Boost Copy)是根据您的情况准确编写的。

于 2012-07-22T00:59:34.983 回答
2

您应该查看ryppl项目,因为这正是它希望实现的目标。如果你点击 github 的链接,你会发现模块化的 boost,然后你可以从那里继续尝试完整的 ryppl 安装。无论如何,有一个中途的房子,那就是模块化的 boost。还有一个模块化的 boost/cmake 使其更简单。这是 ryppl 寻求提升的方向,它应该非常有帮助。我能看到的唯一缺点是零安装安装程序倾向于使用 python 脚本。

如前所述,BCP 也是为此目的而开发的,因此有一个选择。请注意,尽管 boost 正在经历 svn->git 更改,这似乎正在影响某些结构,这反映在与当前模块化 boost 的一些不一致之处,但我不确定这如何/是否会影响 BCP,因为我不知道系统。

于 2012-07-22T20:27:12.980 回答
0

我在让 BCP 正常工作时遇到了一些麻烦。我在这篇 StackOverflow 帖子中记录了与 BCP 相关的问题

在短期内,我只是normal_distribution在我的代码库中添加了一个函数。我把它从过去的几篇 StackOverflow 帖子中整理出来。这个实现没有做任何花哨的模板的东西,但它在其他方面看起来非常类似于normal_distribution.

#include "math.h"
double normal_distribution(double mean, double stdDev)
{
    //scale the number to appropriate distribution 
    return mean + (sampleNormal()*stdDev);
}

//get a number from normal distribution (mean=0, stdDev=1). 
double sampleNormal() {
    double u = ((double) rand() / (RAND_MAX)) * 2 - 1;
    double v = ((double) rand() / (RAND_MAX)) * 2 - 1;
    double r = u * u + v * v;
    if (r == 0 || r > 1) return sampleNormal(); //recursively re-generate number if doesn't meet criteria
    double c = sqrt(-2 * log(r) / r);
    return u * c;
}

感谢这个 StackOverflow 帖子(用户 Pete855217)的sampleNormal()函数,感谢这个StackOverflow 帖子(用户 5084)我命名的函数normal_distribution()

于 2012-07-24T22:32:19.570 回答