首页 > 文章列表 > C++中的随机数生成

C++中的随机数生成

C++编程 算法设计 随机数生成
179 2023-06-10

随机数生成是计算机编程中重要的一环。在C++编程中,随机数也是很常见的,可以用于模拟数据、生成测试数据、游戏开发等方面。本文将介绍C++语言中的几种随机数生成方法。

伪随机数生成

伪随机数生成算法是大多数程序中使用的随机数生成方法,它并不是真正的随机数,是通过一定的数学算法生成的伪随机数。在C++中,可以使用rand函数生成伪随机数。

rand函数定义在stdlib.h头文件中。它返回一个int类型的随机数,范围在0到RAND_MAX之间,RAND_MAX定义在stdlib.h头文件中,其值通常为32767。

示例代码:

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main()
{
    // 设置随机数种子
    srand(time(0));
    
    // 生成10个随机数
    for(int i = 0; i < 10; i++)
    {
        cout << rand() << endl;
    }
    
    return 0;
}

上述代码中,使用srand函数设置随机数种子,time(0)可以获取当前时间的秒数,从而使每次运行程序的结果都不同。然后使用for循环生成10个随机数,并输出到屏幕上。

需要注意的是,每次调用rand函数时,它会返回一个唯一的随机数,但是如果是多次调用,之间的随机数会存在某种程度的相关性。因此,在使用rand函数生成大量随机数时,需要使用其他方式进行混淆处理。

真随机数生成

真随机数是指通过物理现象来生成的随机数,比如可以通过硬件设备采集地震波数据或者光电特性等,但这些硬件设备都是十分昂贵的,对于绝大部分应用程序而言,使用伪随机数生成算法已经够用了。

但是有些需要高安全随机数的应用场景,为了保护数据的安全性和保密性,需要使用真随机数。在这种情况下,可以使用外部设备来提供真随机数。例如,可以通过摇骰子、掷硬币、抽签等方式生成真随机数,但这种方式不仅效率低下,且产生的随机数种类有限。

更常见的方法是通过一个称为随机数生成器(RNG)的物理设备来生成真随机数。它通过收集无法预测的物理过程或者数学程序来生成随机数,同时还能提供一些额外的安全特性。但是,使用真随机数生成器的成本比使用伪随机数生成算法要高得多。

C++ 11中的随机数生成

C++ 11提供了一个新的随机数库,包括两个部分:一是伪随机数生成器,包括多个算法可以较好地满足各种应用场景的需求,二是真随机数生成器,它可以访问系统特殊生成的硬件设施并返回真正的随机数。

C++ 11中的随机数生成库包括:

  • minstd_rand0:线性同余发生器
  • minstd_rand:改进后的线性同余发生器
  • mt19937:Mersenne Twister 19937生成器,性能较好,运行时间较长
  • mt19937_64:Mersenne Twister 19937生成器,返回64位整数
  • ranlux24_base:LUX(level, uniform, eXcellent)发生器,运行速度快,质量高
  • ranlux48_base:LUX(level, uniform, eXcellent)发生器,返回48位整数,运行速度快,质量高
  • knuth_b:Knuth-B(T, P)发生器,生成不同于标准的随机性序列,质量较高

使用C++ 11中的随机数生成库时,需要包含头文件random,并可以使用uniform_int_distribution和uniform_real_distribution函数来控制随机数的范围和类型。

示例代码:

#include <iostream>
#include <random>

using namespace std;

int main()
{
    // 以当前时间作为种子
    default_random_engine engine(time(nullptr));
    
    // uniform_int_distribution:以等概率生成min到max范围内的整数
    uniform_int_distribution<int> distribution(0, 100);
    cout << distribution(engine) << endl;
    
    // uniform_real_distribution:以等概率生成min到max范围内的浮点数
    uniform_real_distribution<double> r_distribution(0, 100);
    cout << r_distribution(engine) << endl;

    return 0;
}

上述代码中,使用default_random_engine来生成随机数种子,并在uniform_int_distribution和uniform_real_distribution中分别指定了生成的整数和浮点数随机数的范围。最后通过调用engine函数来生成随机数。

结论

以上是C++中几种常见的随机数生成方法,不同的应用场景需要不同的随机数生成方法,需要根据实际情况选择合适的方法。在实际编程中,可以结合伪随机数和真随机数的优势,使用一些先进的随机数生成方法以提高程序的效率和安全性。