1 Star 0 Fork 0

green-gitee/博客园

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
std_random.cpp 1.64 KB
一键复制 编辑 原始数据 按行查看 历史
green-gitee 提交于 2024-07-23 22:09 +08:00 . Added resources of 18318363.
// std_random.cpp
#include <cmath>
#include "std_random.hxx"
namespace blogs
{
knuth_b Std_Random::__Engine__;
uniform_real_distribution<double> Std_Random::__Distri__(0, 1);
void
Std_Random::set_seed(long seed)
{
__Engine__.seed(seed);
}
double
Std_Random::random()
{
return __Distri__(__Engine__);
}
int
Std_Random::uniform(int N)
{
return (int)(random() * N);
}
int
Std_Random::uniform(int lo, int hi)
{
return lo + (int)(random()*(hi - lo));
}
long
Std_Random::uniform(long N)
{
return (long)(random() * N);
}
long
Std_Random::uniform(long lo, long hi)
{
return lo + (long)(random()*(hi - lo));
}
double
Std_Random::uniform(double lo, double hi)
{
return lo + random() * (hi - lo);
}
bool
Std_Random::bernoulli(double p)
{
return random() < p;
}
double
Std_Random::gaussian(double mu, double sgm)
{
double r, x, y;
do {
x = uniform(-1.0, +1.0);
y = uniform(-1.0, +1.0);
r = x*x + y*y;
} while (r >= 1 || r == 0);
return mu + sgm * x * std::sqrt(-2 * std::log(r) / r);
}
int
Std_Random::poisson(double lmd)
{
int k = 0;
double p = 1.0;
double exp = std::exp(-lmd);
do {
++k;
p *= random();
} while (p >= exp);
return k-1;
}
int
Std_Random::geometric(double p)
{
return (int)std::ceil(std::log(random()) / std::log(1.0 - p));
}
int
Std_Random::discrete(Array<double> const& probs)
{
double r, sum;
while (true) {
r = random();
sum = 0.0;
for (int i = 0; i < probs.size(); ++i) {
sum += probs[i];
if (sum > r) return i;
}
}
}
} // end of namespace blogs
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/green-gitee/cnblogs.git
git@gitee.com:green-gitee/cnblogs.git
green-gitee
cnblogs
博客园
master

搜索帮助