随机数生成(均匀分布、正态分布、C++)

2023-11-08

一、 生成均匀分布的随机数

1. rand

生成的随机数在0到RAND_MAX(2147483647)之间,在stdlib中定义,使用 % 结合 / 可生成某个范围内的随机数,但是这里生成的随机数是唯一确定的。

#include <iostream>

int main () {
  for (int i = 0; i < 10; ++i) {
    std::cout << rand() << std::endl;
  }
  return 0;
}

2. srand

使用rand函数无法得到变化的随机数,可以使用srand来实现。使用这个srand()函数必须加上头文件 "time.h",需要引入ctime库。其中time(0)是获取从1970年开始的时间(单位:s),然后再获取rand(),这时rand得到的就是随机变化的随机数了。

#include <iostream>

int main () {
  srand(time(0));
  // srand((unsigned)time(NULL)); // 将rand()函数植入系统时间种子
  for (int i = 0; i < 10; ++i) {
    std::cout << rand() << std::endl;
  }
  return 0;
}

3. 生成 0~100 之间的整数随机数

#include <iostream>

int main () {
  srand(time(0));
  for (int i = 0; i < 10; ++i) {
    std::cout << rand() % 100 << std::endl;
  }
  return 0;
}

4. 生成 0~1 之间的随机数

#include <iostream>

int main () {
  srand(time(0));
  for (int i = 0; i < 10; ++i) {
    std::cout << (rand() % 100) * 0.01 << std::endl;
  }
  return 0;
}
#include <iostream>

int main () {
  srand(time(0));
  for (int i = 0; i < 10; ++i) {
    std::cout << rand() * 1.0f / RAND_MAX << std::endl;
  }
  return 0;
}

 5. 生成 -1~1 之间的随机数

#include <iostream>

int main () {
  srand(time(0));
  for (int i = 0; i < 10; ++i) {
    std::cout << (rand() % 200) * 0.01 - 1 << std::endl;
  }
  return 0;
}

 

二、生成高斯/正态分布的随机数

Box-Muller算法利用均匀分布产生高斯分布随机数,算法如下:

上式中的U1和U2是两个在[0,1)上遵从均匀分布的随机数(生成[0,1)上遵从均匀分布的随机数通常使用的是梅森旋转算法)

经过这样的一种计算之后就能产生一个Z服从均匀分布的随机数,这看起来太神奇了,不得不佩服这个算法。说明一下,上面的三个式子,前两个取任何一个都可以用作算法,取正弦还是余弦是无所谓的。另外一点,上面的式子仅仅只能产生标准的高斯分布,若要产生给定的均值和方差其实也很简单。

                                                                   Y=u+(Z*sigma)

上式中的u,sigma是自定义的期望和方差。

#include <cmath>
#include <fstream>
 
int main() {
  std::ofstream fout("gauss.txt", std::ios::out);
	srand(time(0));
  for (int i = 0; i < 10000; ++i) {
    double U1 = rand() * 1.0f / RAND_MAX; // 0~1均匀分布
    double U2 = rand() * 1.0f / RAND_MAX; // 0~1均匀分布
    double Z = sqrt(-2 * log(U1))*cos(2 * M_PI * U2);// 均值为0,方差为1的正态分布
    double Y = 1 + 2 * Z; // 均值为1,方差为4的正态分布
    fout << Y << "\n";
  }
	return 0;
}

可视化

import matplotlib.pyplot as plt
import numpy as np

data=list()
for line in open('gauss.txt', 'r'):
  d = float(line)
  data.append(d)
print(data)

bins=np.arange(-10, 10, 0.5)

plt.hist(data, bins, color='fuchsia', alpha=0.5)
plt.xlabel("range")
plt.ylabel("count")
plt.title("histogram")
plt.show()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机数生成(均匀分布、正态分布、C++) 的相关文章

随机推荐

  • 集合框架--双向链表的模拟实现

    Java中的鏈表 分為三種 1 單向鏈表 由一個節點元素 可以找到相鄰的下一個節點元素 2 雙向鏈表 由一個節點元素 可以找到其相鄰的前 后節點元素 3 循環鏈表 由一個節點元素 可以找到其相鄰的前 后節點元素 由最后一個節點元素可以找到第
  • notepad使用回车与换行

    转载于 http www pythontab com html 2017 linuxkaiyuan 0115 1116 html 一 回车与换行定义 回车 r 本义是光标重新回到本行开头 r的英文return 换行 n 本义是光标往下一行
  • 浅谈Spring中的@Controller注解

    Spring 的 Controller 是单例还是多例 怎么保证并发的安全 controller默认是单例的 不要使用非静态的成员变量 否则会发生数据逻辑混乱 正因为单例所以不是线程安全的 Controller public class S
  • buuctf-misc-小明的保险箱

    小明的保险箱 题目提示四位纯数字密码 但是附件下载下来是jpg文件 猜测是压缩包文件 winhex查看时没有找到什么信息 但是看到了存在txt文件 binwalk一下 把文件放入共享文件夹 上一个博客有提及 binwalk 存在压缩文件 f
  • Java多线程实现的四种方式

    Java多线程实现的方式有四种 1 继承Thread类 重写run方法 2 实现Runnable接口 重写run方法 实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3 通过Callable和FutureT
  • ES6 扩展运算符-将伪数组转换为真正的数组-Array.from()-find()-findIndex()-includes()

    扩展运算符可以将数组拆分成以逗号分隔的参数序列 console把逗号当成console log的分隔符 输出在后台 a b c 扩展运算符的应用 1 数组合并 1 1 1 2 2 将类数组或可遍历对象转换为真正的数组 转换的目的 可以调用数
  • Mybatis

    一 Mybatis简介 1 1 简介 MyBatis 是一款优秀的持久层框架 它支持自定义 SQL 存储过程以及高级映射 MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作 MyBatis可以通过简单的 XML 或
  • Welcome to CSDN————My First Time Write Blog

    Welcome to CSDN My First Time Write Blog 蒟蒻到巨佬 遥不可及 的成长计划 新初一记 第一季自我总结 New hand 来自CSP的初一蒟蒻 请求巨佬教博客的正确 标准写法 2019年7月纪中中集训自
  • 使用最小花费爬楼梯

    到达第i级台阶的阶梯顶部的最小花费 有两个选择 最后踏上了第i级台阶 最小花费dp i 再迈一步到达第i级台阶楼层顶部 最后踏上了第i 1级台阶 最小花费dp i 1 再迈两步跨过第i级台阶直接到达第i级台阶的阶梯顶部 所以到达第i级台阶的
  • MATLAB中求图像中某一区域的质心

    在 MATLAB图像处理宝典 秦襄培 编 384页 有 一个regionprops函数 这个实现对二值图的多种描述 以下内容http blog 163 com zwg 1314 126 blog static 353332462011918
  • Android Studio 问题(二)Failed to find Build Tools revision 28.0.2

    在第一次配置使用Android Studio的时候 可能会出现 Failed to find Build Tools revision 28 0 2 此时 只需要根据提示 点击下方的连接进行安装即可 如果不出现下方的链接 点击右上角的 Tr
  • 使用Navicat远程连接服务器上的mysql数据库

    环境准备 服务器中安装mysql数据库 本地安装Navicat Premium 准备好服务器的ip地址 服务器登录密码 mysql数据库的密码等 服务器中mysql忘记密码解决方法 修改服务器中MySQL的登录设置 通过命令vim etc
  • npg收集指定多个文件目录存储大小监控指标

    原理 1 利用netdata的命令参数 collector textfile directory配置从指定文件读取监控指标信息 2 利用linux cron定时任务脚本收集指定目录存储空间大小信息写入 collector textfile
  • SpringBoot整合数据库之如何整合JdbcTemplate?怎么配置JdbcTemplate多数据源(连接多个数据库)?

    1 整合JdbcTemplate 1 1 引入需要的pom依赖
  • 《Java性能调优实战》笔记(一)Java编程性能调优、多线程性能优化

    文章目录 一 Java性能调优概述 1 1 性能调优标准 1 2 制定性能调优策略 二 Java编程性能调优 2 1 字符串 2 2 正则表达式 2 3 ArrayList和LinkedList的选择 2 4 使用Stream提高遍历集合效
  • 毕业设计-基于 BP 神经网络的房地产价值评估研究-matlab

    目录 前言 课题背景和意义 实现技术思路 一 房地产价值评估指标体系构建 二 基于 BP 神经网络的房地产评估模型构建 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕
  • php发送邮箱源码,php 发送邮箱实例代码

    php教程 发送邮箱实例代码 class pop3 public server pop3 126 com 服务器名 public server port 110 服务器端口 public timeout 30 超过多少时间就算连接失败 pu
  • java启动jar包修改JVM默认内存

    JVM默认物理内存 JVM初始分配的内存由 Xms指定 默认是物理内存的1 64 JVM最大分配的内存由 Xmx指定 默认是物理内存的1 4 默认空余堆内存小于40 时 JVM就会增大堆直到 Xmx的最大限制 空余堆内存大于70 时 JVM
  • 使用pydumpck反编译pyintaller生成的exe文件 python3.10

    目录 前言 一 pyinstaller生成exe 二 pydumpck反编译exe 1 安装 2 反编译exe文件 3 查看反编译的py文件 前言 pyinstaller生成的exe文件想反编译看下源码 但由于安装的python版本太高 p
  • 随机数生成(均匀分布、正态分布、C++)

    一 生成均匀分布的随机数 1 rand 生成的随机数在0到RAND MAX 2147483647 之间 在stdlib中定义 使用 结合 可生成某个范围内的随机数 但是这里生成的随机数是唯一确定的 include