Using rand()/(RAND_MAX +1)
Using rand()/(RAND_MAX +1)
我对rand()的使用有问题:rand()/(rand_MAX+1.0)
我知道rand()的"简单"用法(比如rand(%%100+1),但我不明白什么是整句话rand((rand_MAX+1.0)
简单地说,rand() / (RAND_MAX + 1.0)
生成一个介于0(包括0)和1.0(不包括0)之间的浮点随机数。更准确地说(请参阅http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX作为参考),返回的最大数可以是RAND_MAX/(RAND_MAX+1.0)。然而,在蒙特卡洛模拟的背景下,这种随机数生成器有几个重要点,因为RAND_MAX通常是32767:
- 可以生成的不同随机数的数量太少:32768。他们通常会运行更多的蒙特卡洛模拟——数百万或数十亿——但这样一个有限的随机数生成器使得运行超过32768个模拟变得毫无意义
- 生成的数字粒度太粗:可以得到1/32768、2/32768、3/32768,但不能得到介于两者之间的任何数字
- 随机数生成器引擎的有限状态:在生成RAND_MAX随机数后,实现通常开始重复相同的随机数序列
由于rand()的上述限制,生成蒙特卡洛模拟的随机数的更好选择是以下片段(类似于http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution):
#include <iostream>
#include <random>
#include <chrono>
int main()
{
std::mt19937_64 rng;
// initialize the random number generator with time-dependent seed
uint64_t timeSeed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
std::seed_seq ss{uint32_t(timeSeed & 0xffffffff), uint32_t(timeSeed>>32)};
rng.seed(ss);
// initialize a uniform distribution between 0 and 1
std::uniform_real_distribution<double> unif(0, 1);
// ready to generate random numbers
const int nMonteCarloSimulations = 10;
for (int i = 0; i < nMonteCarloSimulations; i++)
{
double currentRandomNumber = unif(rng);
std::cout << currentRandomNumber << std::endl;
}
return 0;
}
相关文章:
- 为什么我不能将 rand() 与数组的大小一起使用?
- <streamsize>C++ 中 numeric_limits::max() 的值
- 黑客级别的Mini-Max Sum
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 为什么新的随机库比std::rand()更好
- 关于 std::min, std::max 中的比较运算符的混淆
- 为什么rand()的使用被认为是不好的
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- C++使用 rand 定义函数语法
- 为什么 rand 不在我的代码中生成随机数?
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- 从自定义类获取对象向量中的 max 元素
- 如何在C++中递归地找到max元素的索引?
- SFINAE 与 numeric_limits<T>::max() 在 MSVC2017 上
- 为什么 CWE 认为 rand() 具有潜在危险
- 在 c++ 中,rand() 在执行有调试和不带调试的程序时生成不同的结果
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 当min和max为正数时,Rand()返回负数