我需要在指定的时间间隔内生成随机数,即max;min。
此外,随机数应该均匀分布在区间上,而不是定位到特定的点。
目前,我生成的代码如下:
for(int i=0; i<6; i++)
{
DWORD random = rand()%(max-min+1) + min;
}
从我的测试中,随机数只在一个点附近生成。
Example
min = 3604607;
max = 7654607;
生成的随机数:
3631594
3609293
3630000
3628441
3636376
3621404
答案如下:好的,RAND_MAX是32767。我使用的是C++ Windows平台。有没有其他方法来生成具有均匀分布的随机数?
发布于 2013-11-22 11:04:49
为什么rand
是个坏主意
您在这里得到的大多数答案都使用了rand
函数和模运算符。该方法may not generate numbers uniformly (它取决于RAND_MAX
的范围和值),因此不鼓励使用该方法。
范围上的C++11和生成
随着C++11的出现,其他多种选择也出现了增长。其中一个很好地满足了您的需求,即生成一个范围内的随机数:std::uniform_int_distribution
。下面是一个例子:
const int range_from = 0;
const int range_to = 10;
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(range_from, range_to);
std::cout << distr(generator) << '\n';
here就是一个运行的例子。
模板函数可能会有一些帮助:
template<typename T>
T random(T range_from, T range_to) {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<T> distr(range_from, range_to);
return distr(generator);
}
其他随机生成器
header提供了无数其他具有不同分布类型的随机数生成器,包括伯努利、泊松和正态分布。
如何对容器进行混洗?
该标准提供了std::shuffle
,其使用方法如下:
std::vector<int> vec = {4, 8, 15, 16, 23, 42};
std::random_device random_dev;
std::mt19937 generator(random_dev());
std::shuffle(vec.begin(), vec.end(), generator);
该算法将以线性复杂度随机地对元素进行重新排序。
Boost.Random
另一种替代方法是使用Boost.Random,以防您无法访问C++11+编译器。它的界面与C++11非常相似。
发布于 2008-11-13 23:44:17
如果RAND_MAX
为32767,您可以轻松地将位数加倍。
int BigRand()
{
assert(INT_MAX/(RAND_MAX+1) > RAND_MAX);
return rand() * (RAND_MAX+1) + rand();
}
发布于 2008-11-14 00:58:25
如果可以,请使用Boost。我在使用他们的random library时运气很好。
uniform_int
应该做你想做的事情。
https://stackoverflow.com/questions/288739
复制相似问题