首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在整个范围内统一生成随机数

在整个范围内统一生成随机数
EN

Stack Overflow用户
提问于 2008-11-14 07:27:49
回答 15查看 135.1K关注 0票数 105

我需要在指定的时间间隔内生成随机数,即max;min。

此外,随机数应该均匀分布在区间上,而不是定位到特定的点。

目前,我生成的代码如下:

代码语言:javascript
复制
for(int i=0; i<6; i++)
{
    DWORD random = rand()%(max-min+1) + min;
}

从我的测试中,随机数只在一个点附近生成。

代码语言:javascript
复制
Example
min = 3604607;
max = 7654607;

生成的随机数:

代码语言:javascript
复制
3631594
3609293
3630000
3628441
3636376
3621404

答案如下:好的,RAND_MAX是32767。我使用的是C++ Windows平台。有没有其他方法来生成具有均匀分布的随机数?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2013-11-22 11:04:49

为什么rand是个坏主意

您在这里得到的大多数答案都使用了rand函数和模运算符。该方法may not generate numbers uniformly (它取决于RAND_MAX的范围和值),因此不鼓励使用该方法。

范围上的C++11和生成

随着C++11的出现,其他多种选择也出现了增长。其中一个很好地满足了您的需求,即生成一个范围内的随机数:std::uniform_int_distribution。下面是一个例子:

代码语言:javascript
复制
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就是一个运行的例子。

模板函数可能会有一些帮助:

代码语言:javascript
复制
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,其使用方法如下:

代码语言:javascript
复制
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非常相似。

票数 180
EN

Stack Overflow用户

发布于 2008-11-13 23:44:17

如果RAND_MAX为32767,您可以轻松地将位数加倍。

代码语言:javascript
复制
int BigRand()
{
    assert(INT_MAX/(RAND_MAX+1) > RAND_MAX);
    return rand() * (RAND_MAX+1) + rand();
}
票数 10
EN

Stack Overflow用户

发布于 2008-11-14 00:58:25

如果可以,请使用Boost。我在使用他们的random library时运气很好。

uniform_int应该做你想做的事情。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/288739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档