某些范围内的随机数c ++

Abd*_*mad 52 c++ random

可能重复:
在整个范围内均匀生成随机数

我想在c ++中生成随机数,在某些范围内,假设我希望数字在25到63之间.

我怎么能这样.

谢谢

Cub*_*bbi 197

既然没人发布现代C++方法,

#include <iostream>
#include <random>
int main()
{
    std::random_device rd; // obtain a random number from hardware
    std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<> distr(25, 63); // define the range

    for(int n=0; n<40; ++n)
        std::cout << distr(eng) << ' '; // generate numbers
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想知道"黑客是什么`mt19937`类型?!" - `32位数字的梅森倍捻机伪随机生成器具有19937的状态下尺寸bits.`它是一个"包装",为"mersenne_twister_engine"模板(http://www.cplusplus.com/reference/random/ mersenne_twister_engine /)预设params. (22认同)
  • 注意`std :: uniform_int_distribution <>`是包容性的 - 在上面的例子中是`[25,63]`. (11认同)
  • @Akiva我认为,最后是正确的.如果您的发行版中没有它,则应将编译器升级到符合C++ 11的编译器.它不是一个已弃用的功能,而是一个新功能.GCC 4.9+当然应该有它. (6认同)
  • 另外值得注意的是,使用浮点数/双精度执行同样的操作,可以使用std :: uniform_real_distribution <>.很棒的答案! (6认同)
  • @Akiva和@ polkovnikov.ph:这与升级编译器无关(GCC已经支持C ++ 11了),而是关于使用`-std = c ++ 11`编译器标志切换到C ++ 11的问题。由于C ++ 11不向后兼容,因此所有符合标准的编译器(GCC,clang等)都需要显式激活C ++ 11。 (2认同)

K-b*_*llo 18

您可以使用标准库(TR1)添加中包含的随机功能.或者您可以使用在纯C中工作的相同旧技术:

25 + ( std::rand() % ( 63 - 25 + 1 ) )
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此答案*不会产生同样可能的数字!*以下答案是更好的方法. (22认同)
  • @GeorgeHilliard“下面”是相对的。 (5认同)
  • @milanHrabos 一个例子可以很容易地阐明这一点:“std::rand()”返回从“0”到“RAND_MAX”(*包括*)均匀分布的整数。现在,假设您通过使用“std::rand() % RAND_MAX”获得了从“0”到“RAND_MAX - 1”(含)范围内的整数,那么获得“0”的机会现在会加倍,因为它将是“std::rand()”返回*“0”*或*“RAND_MAX”时的结果。任何其他数字只有在通过 `std::rand()` 直接返回时才会获得。这同样适用于不是“RAND_MAX + 1”除数的每个模。 (3认同)

Naw*_*waz 18

int random(int min, int max) //range : [min, max)
{
   static bool first = true;
   if (first) 
   {  
      srand( time(NULL) ); //seeding for the first time only!
      first = false;
   }
   return min + rand() % (( max + 1 ) - min);
}
Run Code Online (Sandbox Code Playgroud)

  • 为了包含max,你必须使用max - min + 1 (3认同)
  • 它是否包括负数和正数之间的范围? (2认同)

Ben*_*ley 11

int range = max - min + 1;
int num = rand() % range + min;
Run Code Online (Sandbox Code Playgroud)

  • @Anson:"Johannes Rudolph"抱怨的原因是%不起作用,除非右边的值是RAND_MAX的精确除数.如果不是,则某些值具有轻微(非常轻微)的较小概率.例如:RAND_MAX(32767)`r = rand()%3;`概率为0(10923/32767)1(10922/32767)2(10922/32767)注意0的概率略高.正如'Benjamin Lindley'所指出的那样,在大多数情况下这是微不足道的,但是当你做加密这样的事情时,这样的事情就成了问题.因此,当使用这种方法时,很多人都会犯规. (6认同)
  • 不好的建议.这不会产生均匀分布.这是一种相当普遍的方法(但从根本上说是有缺陷的). (4认同)
  • 还有一个问题是 rand() 的底部几位不是很随机(因此,如果 max-min 很小,您将无法获得好的值(这可能已修复))。替代方案是`num = rand() * 1.0 / RAND_MAX * (max-min+1) + min;` (2认同)

Kil*_*aro 9

使用rand函数:

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

引用:

A typical way to generate pseudo-random numbers in a determined range using rand is to use the modulo of the returned value by the range span and add the initial value of the range:

( value % 100 ) is in the range 0 to 99
( value % 100 + 1 ) is in the range 1 to 100
( value % 30 + 1985 ) is in the range 1985 to 2014
Run Code Online (Sandbox Code Playgroud)

  • 见:http://www.azillionmonkeys.com/qed/random.html (3认同)

Yur*_*han 5

float RandomFloat(float min, float max)
{
    float r = (float)rand() / (float)RAND_MAX;
    return min + r * (max - min);
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是均匀分布。尝试将 7 个球放入 3 个桶中,使每个桶中的球数量相同。你正在做同样的事情。 (2认同)