C++ 伪随机数

C++ 伪随机数思路 nbsp nbsp nbsp nbsp 按照一定的规则打乱有序序列 既然要求每次运行的结果不同 打乱的规则里就需要用到随机数 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 伪随机数伪随机数序列是用确定性的算法计算出来的遵循某种概率分布的序列 程序的运行过程是一个确定的过程 每一条指令都是确定 blue nbsp nbsp nbsp nbsp blueblue nbsp amp n

       

真随机数

        自然界中的有很多不确定的物理现象,通过测量这些现象,就可以获得真随机数。比如白噪声的幅值、电子元器件的电压噪声等,真随机数可以通过用硬件对这些参数进行采集获得。

       

       

伪随机数

        伪随机数序列是用确定性的算法计算出来的周期很长的序列。程序的运行过程是一个确定的过程,每一条指令都是确定的,因此不能产生真的随机数。
        说到伪随机数就会说到种子,什么是种子呢,我们可以将种子理解为一个初始值,特定算法根据这个初始值产生一个一定的序列,生成的这个序列“看起来”是随机的,实际上是一个周期很长的确定序列。如果每次的种子设置得相同,那么产生的序列都是相同的。
        举个例子,我们可以简单的设置这个种子为某个数,比如1。请看如下代码,用srand()设置种子的值用rand()产生伪随机数序列,需要包含头文件#include
。重复运行下列代码,因为种子相同,所以每次输出的序列都是如图的序列”41 18467 6334 26500 …”。




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

C++ 伪随机数

       

       

        如果每次种子设置得不同,那生成的序列也将不同。 如何获得不同的种子呢?
       可以用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");
}

       

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225811.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:29
下一篇 2026年3月17日 上午8:29


相关推荐

  • vue 表单验证

    vue 表单验证1 6 位小写字母和数字必须包含两个字母 rules required true message XXX 不能为空 trigger blur max 6 message 最大长度为 6 位字符 trigger blur pattern a z a z 2 a z0 9 6 6 不连续的两位字母

    2026年3月18日
    3
  • 老猿学5G:融合计费基于QoS流计费QBC的触发器Triggers

    老猿学5G:融合计费基于QoS流计费QBC的触发器Triggers前往老猿 Python 博文目录 一 引言在 老猿学 5G 融合计费基于流计费的触发器 Triggers 介绍了基于流计费的触发器情况 同时介绍了 SMF 中的计费相关触发器除了基于流计费的触发器 FlowBasedCha FBC triggers 外 还有基于 QoS 流计费的触发器 QoSflowBased QBC triggers 本文介绍基于 QoS 计费的触发器 二 基于 QoS 计费的触发器类别和触发层级基于 QoS 流计费的触发器类别和基于流计费的完全相

    2026年3月18日
    3
  • Android EditText设置只能输入数字和小数点

    Android EditText设置只能输入数字和小数点EditText 可以设置多种输入方式 其中若要设置输入数字和小数点时应注意一下几点 有两种写法 一 利用安卓自身的语法 二 利用正则表达式 一 利用安卓自身的语法 1 如果设置只输入数字 edittext setInputType InputType TYPE CLASS NUMBER 此时只会弹出数字输入框 符号点击后不会输入到文字框中 2 只能输入数字和小数点

    2026年3月20日
    1
  • dubbo注册中心-zookeeper

    dubbo注册中心-zookeeperdubbo注册中心-zookeeper

    2022年4月25日
    69
  • 【商品架构day8】京东几百亿的商品怎么搜索

    【商品架构day8】京东几百亿的商品怎么搜索本文来自京东王春明老师的分享 主要介绍京东商品搜索的整体架构 京东商品搜索简介京东商品搜索引擎是搜索推荐部自主研发的商品搜索引擎 主要功能是为海量京东用户提供精准 快速的购物体验 目前入口主要有 PC 移动 微信 手 Q 搜索 移动列表页 店铺搜索 店铺列表等 虽然只有短短几年的时间 系统已经能够支持日均 PV 过亿的请求 并且经过了多次 618 店庆和双 11 的考验 与人们日常使用的如谷

    2026年3月26日
    2
  • SQL2005关于quotename的用法(转)[通俗易懂]

    SQL2005关于quotename的用法(转)[通俗易懂]首先,sqlserver里的标识符有一定的规则,比如 你createtableabc123(…)那么中间含有空格,它不是符合规则的。你会写做createtable[abc123](….)即以[]来定界标识符。quotename将字串成为有效的标识符。它有什么用呢?我举个例子:你有个表名字叫做aa[]bb当

    2022年7月25日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号