C++产生随机数的几种方法小结

 更新时间:2023年03月09日 10:08:25   作者:新世纪debug战士  
本文主要介绍了C++产生随机数的几种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

使用cstdlib库

C++11之前,C和C++都用相同的方法来产生随机数(伪随机数),即rand()函数,用法如下:

1)使用srand()撒一个种子

功能:初始化随机数发生器

用法:void srand(unsigned int seed)

2)使用rand()产生随机数

功能:随机数发生器

用法:int rand(void)

3)控制随机数范围

要取得 [a,b) 的随机整数,使用 (rand() % (b-a))+ a;

要取得 [a,b] 的随机整数,使用 (rand() % (b-a+1))+ a;

要取得 (a,b] 的随机整数,使用 (rand() % (b-a))+ a + 1;

** 参考:C++ rand 与 srand 的用法

4)示例代码

#include <iostream>
#include <ctime>
#include <cstdlib>
 
int getRand(int min, int max);
 
int main() {
 
    srand(time(0));
 
    for (int i=0; i<10; i++) {
        int r = getRand(2,20);
        std::cout << r << std::endl;
    }
 
    return 0;
}
 
// 左闭右闭区间
int getRand(int min, int max) {
    return ( rand() % (max - min + 1) ) + min ;
}

使用random库:c++11 random library

C++11之前,无论是C,还是C++都使用相同方式的来生成随机数,而在C++11中提供了随机数库,包括随机数引擎类、随机数分布类,简介如下:

随机数引擎类

一般使用 default_random_engine 类,产生随机非负数(不推荐直接使用)

直接使用时:

#include <iostream>
#include <ctime>
#include <random>
 
int main() {
 
    std::default_random_engine e;
    e.seed(time(0));
 
    for (int i=0; i<10; i++) {
        std::cout << e() << std::endl;
    }
 
    return 0;
}

输出结果:

16807
282475249
1622650073
984943658
1144108930
470211272
101027544
1457850878
1458777923
2007237709

随机数分布类

uniform_int_distribution:产生均匀分布的整数

示例代码:

#include <iostream>
#include <ctime>
#include <random>
 
int main() {
 
    std::default_random_engine e;
    std::uniform_int_distribution<int> u(2,20); // 左闭右闭区间
    e.seed(time(0));
 
    for (int i=0; i<10; i++) {
        std::cout << u(e) << std::endl;
    }
 
    return 0;
}

输出结果:

4
5
16
17
15
17
6
10
13
13

uniform_real_distribution:产生均匀分布的实数

#include <iostream>
#include <ctime>
#include <random>
 
int main() {
 
    std::default_random_engine e;
    std::uniform_real_distribution<double> u(1.5,19.5); // 左闭右闭区间
    e.seed(time(0));
 
    for (int i=0; i<10; i++) {
        std::cout << u(e) << std::endl;
    }
 
    return 0;
}

输出结果:

11.9673
2.29179
9.82668
9.82764
10.2394
13.8324
2.95336
9.72177
16.5145
12.1421

normal_distribution:产生正态分布的实数

示例代码:

#include <iostream>
#include <ctime>
#include <random>
 
int main() {
 
    std::default_random_engine e;
    std::normal_distribution<double> u(0,1); // 均值为0,标准差为1
    e.seed(time(0));
 
    for (int i=0; i<10; i++) {
        std::cout << u(e) << std::endl;
    }
 
    return 0;
}

输出结果:

0.390995
-0.680137
-1.02953
-0.53243
0.375886
-0.19804
-0.796159
0.837714
0.899632
2.06609

bernoulli_distribution:生成二项分布的布尔值

#include <iostream>
#include <ctime>
#include <random>
 
int main() {
 
    std::default_random_engine e;
    std::bernoulli_distribution u(0.8); // 生成1的概率为0.8
    e.seed(time(0));
 
    for (int i=0; i<10; i++) {
        std::cout << u(e) << std::endl;
    }
 
    return 0;
}

输出结果:

1
0
1
1
1
1
1
1
1
1

参考:C++11新特性(75)-随机数库(Random Number Library)

到此这篇关于C++产生随机数的几种方法小结的文章就介绍到这了,更多相关C++产生随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2022 配置 PCL 1.12.1 的问题小结

    Visual Studio 2022 配置 PCL 1.12.1 的问题小结

    这篇文章主要介绍了Visual Studio 2022 配置 PCL 1.12.1 的经验总结分享,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 深入分析Visual C++进行串口通信编程的详解

    深入分析Visual C++进行串口通信编程的详解

    本篇文章是对Visual C++进行串口通信编程进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++练习题之合并k个已排序的链表

    C/C++练习题之合并k个已排序的链表

    这篇文章主要给大家介绍了关于C/C++练习题之合并k个已排序的链表的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家学习或者使用C/C++具有一定的参考学习价值,需要的朋友可以参考下
    2023-06-06
  • 分享常用的3个C++小技巧

    分享常用的3个C++小技巧

    这篇文章主要分享了常用的3个C++小技巧,
    2021-12-12
  • C语言多组输入使用方法

    C语言多组输入使用方法

    这篇文章主要给大家介绍了关于C语言多组输入使用的相关资料,在 C语言中可以使用循环语句来实现多组输入,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 用C语言实现三子棋游戏

    用C语言实现三子棋游戏

    这篇文章主要为大家详细介绍了用C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Qt使用QWT绘制柱状图详解

    Qt使用QWT绘制柱状图详解

    QT中提供了一个叫做QWT的库。QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。本文将通过它绘制柱状图,需要的可以参考一下
    2022-01-01
  • C++类的返回值是*this的成员函数问题

    C++类的返回值是*this的成员函数问题

    这篇文章主要介绍了C++类的返回值是*this的成员函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Qt基于QScrollArea实现界面嵌套移动

    Qt基于QScrollArea实现界面嵌套移动

    在实际的应用场景中,经常会出现软件界面战场图大于实际窗体大小。本文将利用QScrollArea可以为widget窗体添加滚动条,实现界面嵌套移动,感兴趣的可以了解一下
    2022-06-06
  • C++ Primer注解之引用和指针

    C++ Primer注解之引用和指针

    这篇文章主要介绍了C++ Primer注解之引用和指针的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论