服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++生成随机浮点数的示例代码

C++生成随机浮点数的示例代码

2022-11-09 14:37叫我小秦就好了 C/C++

在C++11之前,我们通常采用rand函数来生成随机数,但rand函数对一些情况显得难以处理。本文将介绍如何利用C++生成随机浮点数,需要的可以参考一下

前言

在C++11之前,我们通常采用rand函数来生成随机数。

但rand函数对一些情况显得难以处理:

  • 不同范围的随机数
  • 需要随机浮点数
  • 需要非均匀分布的随机数

rand生成随机数

问题出现

场景描述:

想生成一组整形随机数,放入数组中,用来测试自己的排序是否正确。

于是我写出了下方代码,生成随机数。

先简单了解下用到的函数:

?
1
2
3
4
5
6
7
8
//返回time_t类型的 当前时间的时间戳
time_t time (time_t* timer);
 
//传入一个种子,为伪随机数生成器初始化
void srand (unsigned int seed);
 
//得到一个整形伪随机数
int rand (void);
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
int main()
{
    int arr[10] = { 0 };
    
    for (int i = 0; i < 10; ++i)
    {
        srand((unsigned int)time(NULL));
        //两个相减是为了出现负的随机数,使测试范围更广
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
        
        printf("%d ", arr[i]);
    }
    
    return 0;
}

我发现尽管我调用了srand函数,可生成的数组值还是同一个。

我思考后想到,因为for循环执行速度太快,整个程序都是在一秒内完成的。

所以出现了都是同一个值的情况。

初步解决

于是我想出了下面的解决方法:

我可以在for循环内调用Sleep函数,让我的电脑休眠一下,这样就不会出现上述情况了。

于是我写出了下方的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
 
 
int main()
{
    int arr[10] = { 0 };
 
    for (int i = 0; i < 10; ++i)
    {
        Sleep(1000);
        srand((unsigned int)time(NULL));
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
 
        printf("%d ", arr[i]);
    }
 
    return 0;
}

通过休眠后,就成功解决问题了。

可是,

如果睡眠时间太短,那么还是会出现重复的现象;

如果睡眠时间太长,程序运行速度就太慢。

最终方法

因为上述的原因,我继续查询资料,了解了rand和srand的基本原理,最终成功解决了该问题。

给srand函数传入一个数值后,srand会根据这个生成一个随机序列表(通常有4,294,967,296个数),传入相同的数生成的序列表是相同的。然后rand从序列的头部取出一个数返回,然后将这个数放在随机序列表尾部,因此如果你要取的数据量非常大,是会出现与之前取出的数重复的情况。

此时,上面出现的问题也很好解决了。因为计算机运行速度很快,所以我们每次进入循环都会生成一个相同的随机序列表,rand函数只会取出其第一个数。

要解决这个问题,我们只需要在循环前调用一次srand函数就好了,这样就不会重复生成序列表了。

下方是最终形式的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
int main()
{
    int arr[10] = { 0 };
 
    srand((unsigned int)time(NULL));
    for (int i = 0; i < 10; ++i)
    {
        arr[i] = (rand() % 100 + 1) - (rand() % 100 + 1);
 
        printf("%d ", arr[i]);
    }
 
    return 0;
}

下文将使用C++11定义在头文件random中的随机数库通过一组协作的类来解决这些问题:随机数引擎类随机数分布类

  • 一个引擎类可以生成unsigned随机数序列
  • 一个分布类使用一个引擎类生成指定类型的、在给定范围内的、服从特定概率分布的随机数

生成等概率随机数

生成随机整数

uniform_int_distribution:产生均匀分布的整数

?
1
2
3
4
5
6
template <class IntType = int>
class uniform_int_distribution;
 
// IntType
// An integer type. Aliased as member type result_type.
// By default, this is int.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
 
int main()
{
    //产生[1, 100]左闭右闭区间的随机整数
    uniform_int_distribution<int> u(1, 100);
    default_random_engine e;
    //为随机数引擎设置随机种子,若不设置每次生成的随机数相同(可以创建时设置)
    //类似srand的用法,相同的种子生成的随机数相同
    //default_random_engine e(time(NULL));
    e.seed(time(NULL));
 
    for (size_t i = 0; i < 10; ++i)
    {
        cout << u(e) << " ";
    }
    cout << endl;
 
    return 0;
}

生成随机浮点数

uniform_real_distribution:产生均匀分布的实数

?
1
2
3
4
5
6
template <class RealType = double>
class uniform_real_distribution;
 
// RealType
// A floating-point type. Aliased as member type result_type.
// By default, this is double.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
 
int main()
{
    //生成[-1, 1]范围随机浮点数
    //模板参数只能是浮点类型(float,double, long double)
    uniform_real_distribution<double> u(-1, 1);
    default_random_engine e(time(NULL));
 
    for (size_t i = 0; i < 10; ++i)
    {
        cout << u(e) << " ";
    }
    cout << endl;
    
    return 0;
}

生成非均匀分布随机数

正态分布随机数

?
1
2
template <class RealType = double>
class normal_distribution;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
 
int main()
{
    //生成符合均值为10,标准差为2的随机数
    normal_distribution<double> u(10, 2);
    default_random_engine e(time(NULL));
    
    for (size_t i = 1; i <= 100; ++i)
    {
        printf("%-9.6lf ", u(e));
        if (i % 10 == 0)
        {
            cout << endl;
        }
    }
    cout << endl;
 
    return 0;
}

二项分布的布尔值

?
1
class bernoulli_distribution;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <random>
#include <ctime>
using namespace std;
 
int main()
{
    // 生成1的概率为0.7
    bernoulli_distribution u(0.7);
    default_random_engine e(time(NULL));
 
    for (int i = 0; i < 10; i++) {
        cout << u(e) << " ";
    }
    cout << endl;
 
    return 0;
}

以上就是C++生成随机浮点数的示例代码的详细内容,更多关于C++随机浮点数的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/qq_40080842/article/details/124166928

延伸 · 阅读

精彩推荐
  • C/C++C语言利用模板实现简单的栈类

    C语言利用模板实现简单的栈类

    这篇文章主要为大家详细介绍了C语言利用模板实现简单的栈类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    chi_mian6152021-07-15
  • C/C++C语言实现任何文件的加密解密功能

    C语言实现任何文件的加密解密功能

    这篇文章主要为大家详细介绍了C语言实现任何文件的加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    贝尔拉梅拉热翔4292021-07-25
  • C/C++C语言Static 关键字解析

    C语言Static 关键字解析

    这篇文章主要介绍了C语言Static 关键字解析,C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的。写这篇章主要...

    Firefly7212022-09-26
  • C/C++C++实现LeetCode(37.求解数独)

    C++实现LeetCode(37.求解数独)

    这篇文章主要介绍了C++实现LeetCode(37.求解数独),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang7832021-11-26
  • C/C++C语言二维数组几种常用的表示方法

    C语言二维数组几种常用的表示方法

    今天小编就为大家分享一篇关于C语言二维数组几种常用的表示方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    BLSxiaopanlaile8972021-07-24
  • C/C++C++实现数据文件存储与加载

    C++实现数据文件存储与加载

    这篇文章主要为大家详细介绍了C++实现数据文件存储与加载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    你是天使放纵我的固执9642021-07-30
  • C/C++C语言实现三子棋方法

    C语言实现三子棋方法

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    幽沫沫3592021-10-20
  • C/C++简单谈谈C语言中的= 和==、!=

    简单谈谈C语言中的= 和==、!=

    这篇文章主要给大家介绍了关于C语言中= 和==、!=的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    南雨兮11942021-09-27