C++中的伪随机数

 更新时间:2022年07月20日 10:06:19   作者:舒泱  
这篇文章主要介绍了C++中的伪随机数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

真随机数

自然界中的有很多不确定的物理现象,通过测量这些现象,就可以获得真随机数。

比如白噪声的幅值、电子元器件的电压噪声等,真随机数可以通过用硬件对这些参数进行采集获得。

伪随机数

伪随机数序列是用确定性的算法计算出来的周期很长的序列。

程序的运行过程是一个确定的过程,每一条指令都是确定的,因此不能产生真的随机数。       

说到伪随机数就会说到种子,什么是种子呢,我们可以将种子理解为一个初始值,特定算法根据这个初始值产生一个一定的序列,生成的这个序列“看起来”是随机的,实际上是一个周期很长的确定序列。

如果每次的种子设置得相同,那么产生的序列都是相同的。       

举个例子

我们可以简单的设置这个种子为某个数,比如1。

请看如下代码,用srand()设置种子的值,用rand()产生伪随机数序列,需要包含头文件#include <stdlib.h>。重复运行下列代码,因为种子相同,所以每次输出的序列都是如图的序列"41 18467 6334 26500 …"。

srand(1);   // 设置种子的值为1,如果不设置,默认种子为1
for (int i = 0; i < 10; ++i) {
    cout << rand() << " ";	// 输出10个伪随机数
}

如果每次种子设置得不同,那生成的序列也将不同。 如何获得不同的种子呢?       

可以用C语言中的库函数 time_t time(time_t *seconds) 返回自1970-01-01 00:00:00 UTC 起经过的时间,以秒为单位。

这个函数的入参seconds也能保存结果,请看如下代码,输出的t和seconds的值是一样的。

    time_t seconds;
    time_t t=time(&seconds);
    cout << t <<" "<< seconds <<endl;  // t和seconds的值是一样的

那么,我们将当前的时间设置为种子,由于时间一直在变,种子就一直在变,每次就能生成不同的伪随机数序列。

time_t t=time(nullptr);
srand(t);   // 设置种子的值为时间
for (int i = 0; i < 10; ++i) {
    cout << rand() << " ";
}

C++代码示例

题目

将1-100的有序序列变成无序序列,要求每次运行的结果不同。

// 题目:将1-100的有序序列变成无序序列,要求每次运行的结果不同。
void fun(vector<int> &vec) {
    time_t t = time(nullptr);
    srand(t);   // 设置种子的值为时间
    rand();
    for (int i = 0; i < 500; ++i) {
        // 每次随机交换数组中的两位
        swap(vec[rand() % 100], vec[rand() % 100]);
    }  
}
int main() {
    vector<int> vec(100);
    for (int i = 0; i < 100; ++i) {
        vec[i] = i+1;
    }
    fun(vec);
    for (auto it : vec) {
        cout << it << " ";
    }
    cout << endl;
    system("pause");
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 深入解析C++中派生类的构造函数

    深入解析C++中派生类的构造函数

    这篇文章主要介绍了深入解析C++中派生类的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++实现加减乘除计算器

    C++实现加减乘除计算器

    这篇文章主要为大家详细介绍了C++实现加减乘除计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-01-01
  • Clion下载安装使用的详细教程(Win+MinGW)

    Clion下载安装使用的详细教程(Win+MinGW)

    这篇文章主要介绍了Clion下载安装使用教程(Win+MinGW),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • C++之智能指针初步及弃用auto_ptr的原因分析

    C++之智能指针初步及弃用auto_ptr的原因分析

    这篇文章主要介绍了C++之智能指针初步及弃用auto_ptr的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • C++有限状态机实现详解

    C++有限状态机实现详解

    这篇文章主要为大家详细介绍了C++有限状态机的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 浅谈C++高并发场景下读多写少的优化方案

    浅谈C++高并发场景下读多写少的优化方案

    本文主要介绍了浅谈C++高并发场景下读多写少的优化方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 查找算法之二分查找的C++实现

    查找算法之二分查找的C++实现

    今天小编就为大家分享一篇关于查找算法之二分查找的C++实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++ Boost EnableIf函数使用介绍

    C++ Boost EnableIf函数使用介绍

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C/C++实现获取系统时间的示例代码

    C/C++实现获取系统时间的示例代码

    C 标准库提供了 time() 函数与 localtime() 函数可以获取到当前系统的日历时间。本文将通过一些简单的示例为大家讲讲C++获取系统时间的具体方法,需要的可以参考一下
    2022-12-12
  • C语言函数指针与回调函数的实现

    C语言函数指针与回调函数的实现

    本文主要介绍了C语言函数指针与回调函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论