当前位置: 首页 > news >正文

random — 伪随机数生成器(史上总结最全)

目的:实现几种类型的伪随机数生成器。

random 模块基于 Mersenne Twister 算法提供了一个快速的伪随机数生成器。Mersenne Twister 最初开发用于为蒙特卡洛模拟器生成输入,可生成具有分布均匀,大周期的数字,使其可以广泛用于各种应用。

生成随机数
random() 函数从生成的序列中返回下一个随机浮点数。所有返回值都在 0<= n < 1.0 范围内。

random_random.pyimport randomfor i in range(5):print('%04.3f' % random.random(), end=' ')
print()

反复运行程序生成不同序列的数字。

$ python3 random_random.py0.859 0.297 0.554 0.985 0.452$ python3 random_random.py0.797 0.658 0.170 0.297 0.593

为了生成指定范围内的数字,使用 uniform() 方法。

random_uniform.pyimport randomfor i in range(5):print('{:04.3f}'.format(random.uniform(1, 100)), end=' ')
print()

传入最小和最大值, uniform() 使用公式 min + (max - min) *random() 调整 random() 的返回值。

$ python3 random_uniform.py12.428 93.766 95.359 39.649 88.983
Seeding

random() 每次调用的时候都生成不同的值,并且在它重复任何数字之前有一个很大的周期。这对于生成唯一值及其变体很有用,但有时以不同的方式处理相同的数据集是很有用的。一种技术是用一个程序生成随机数并保存他们以通过单独的步骤进行处理。然而,对于大量数据可能不实用,所以,random 模块包含了 seed() 函数用于初始化伪随机数生成器以生成预期的一组值。

random_seed.pyimport randomrandom.seed(1)for i in range(5):print('{:04.3f}'.format(random.random()), end=' ')
print()

种子值用于控制根据公式生成的伪随机数序列的第一个值,并且由于公式是确定的,所以种子改变后它实际上设置了生成的完整序列。传入 seed() 的参数可以是任何可哈希的对象。默认使用基于平台的随机源(如果可用),否则,使用当前时间。

$ python3 random_seed.py0.134 0.847 0.764 0.255 0.495$ python3 random_seed.py0.134 0.847 0.764 0.255 0.495

保存状态
random() 使用的伪随机数生成算法的内部状态可以被保存下来,然后用于控制子序列运行时生成的数字。在继续之前,从较早的输入恢复状态减少了生成重复值和序列的可能性。getstate() 函数可以返回随后用于 setstate() 的重新初始化随机数生成器的数据。

random_state.pyimport random
import os
import pickleif os.path.exists('state.dat'):# Restore the previously saved stateprint('Found state.dat, initializing random module')with open('state.dat', 'rb') as f:state = pickle.load(f)random.setstate(state)
else:# 使用一个初始状态print('No state.dat, seeding')random.seed(1)

生成随机数

for i in range(3):print('{:04.3f}'.format(random.random()), end=' ')
print()

为下次使用保存状态

with open('state.dat', 'wb') as f:pickle.dump(random.getstate(), f)

生成更多的随机数

print('\nAfter saving state:')
for i in range(3):print('{:04.3f}'.format(random.random()), end=' ')
print()

getstate() 返回的数据是一个实现细节,所以这个例子使用 pickle 保存数据到文件,仅仅将它视作一个黑盒子。当程序开始的时候,如果该文件存在,它加载旧的状态然后继续。每次在保存状态前后运行生成了一些数字,去演示恢复状态导致生成器产生了再次产生了相同的值。

$ python3 random_state.pyNo state.dat, seeding
0.134 0.847 0.764After saving state:
0.255 0.495 0.449$ python3 random_state.pyFound state.dat, initializing random module
0.255 0.495 0.449After saving state:
0.652 0.789 0.094

随机整数
random() 生成浮点数。可以将结果转换为整数, 但使用 randint() 直接生成整数更方便。

random_randint.pyimport randomprint('[1, 100]:', end=' ')for i in range(3):print(random.randint(1, 100), end=' ')print('\n[-5, 5]:', end=' ')
for i in range(3):print(random.randint(-5, 5), end=' ')
print()
randint() 的取值范围是其参数的闭区间。数字可以是正数或负数,但第一个值应小于第二个值。$ python3 random_randint.py[1, 100]: 98 75 34
[-5, 5]: 4 0 5
randrange() 是从范围中选择值的更一般形式。random_randrange.pyimport randomfor i in range(3):print(random.randrange(0, 101, 5), end=' ')
print()

randrange() 支持 step 参数,除了开始和结束值, 所以它完全等同于从 range(start, stop, step) 中选择一个随机值。它效率更高,因为范围实际上并没有构建。

$ python3 random_randrange.py15 20 85

随机选择序列值
随机数生成器的一个常见用途是从枚举序列中返回随机项,既是这些值不是数字。 random 模块包含了 choice() 函数用于从序列中随机获取值。这个例子模拟了投 10000 次硬币正面和反面出现的次数。

random_choice.pyimport random
import itertoolsoutcomes = {'heads': 0,'tails': 0,
}
sides = list(outcomes.keys())for i in range(10000):outcomes[random.choice(sides)] += 1print('Heads:', outcomes['heads'])
print('Tails:', outcomes['tails'])
这里仅有两个可允许的结果,因此不是使用数字并转换他们,而是直接将 "heads""tails" 与 choice() 一起时候用。$ python3 random_choice.pyHeads: 5091
Tails: 4909

排列
对棋牌游戏的模拟需要混合一副牌,然后把它们发给玩家,并且不能多次使用同一张牌。使用 choice() 会导致相同的牌被多次使用,因此可以使用 shuffle() 洗牌,然后在发牌的时候移除他们。

random_shuffle.pyimport random
import itertoolsFACE_CARDS = ('J', 'Q', 'K', 'A')
SUITS = ('H', 'D', 'C', 'S')def new_deck():return [# 值总是用两个值,所以字符串有一致的长度'{:>2}{}'.format(*c)for c in itertools.product(itertools.chain(range(2, 11), FACE_CARDS),SUITS,)]def show_deck(deck):p_deck = deck[:]while p_deck:row = p_deck[:13]p_deck = p_deck[13:]for j in row:print(j, end=' ')print()

创建一副有序新牌

deck = new_deck()
print('Initial deck:')
show_deck(deck)

随机打乱牌的次序

random.shuffle(deck)
print('\nShuffled deck:')
show_deck(deck)

Deal 4 hands of 5 cards each

hands = [[], [], [], []]for i in range(5):for h in hands:h.append(deck.pop())

展示手里的牌

print('\nHands:')
for n, h in enumerate(hands):print('{}:'.format(n + 1), end=' ')for c in h:print(c, end=' ')print()

展示剩下的牌

print('\nRemaining deck:')
show_deck(deck)
卡片表示为带有面值和数字。通过每次向四个列表中添加一张卡片,并且将其从牌桌上移除以使其无法再次使用而创建默认的 「hands」。$ python3 random_shuffle.pyInitial deck:2H  2D  2C  2S  3H  3D  3C  3S  4H  4D  4C  4S  5H5D  5C  5S  6H  6D  6C  6S  7H  7D  7C  7S  8H  8D8C  8S  9H  9D  9C  9S 10H 10D 10C 10S  JH  JD  JCJS  QH  QD  QC  QS  KH  KD  KC  KS  AH  AD  AC  ASShuffled deck:QD  8C  JD  2S  AC  2C  6S  6D  6C  7H  JC  QS  QCKS  4D 10C  KH  5S  9C 10S  5C  7C  AS  6H  3C  9H4S  7S 10H  2D  8S  AH  9S  8H  QH  5D  5H  KD  8D
10D  4C  3S  3H  7D  AD  4H  9D  3D  2H  KC  JH  JSHands:
1:  JS  3D  7D 10D  5D
2:  JH  9D  3H  8D  QH
3:  KC  4H  3S  KD  8H
4:  2H  AD  4C  5H  9SRemaining deck:QD  8C  JD  2S  AC  2C  6S  6D  6C  7H  JC  QS  QCKS  4D 10C  KH  5S  9C 10S  5C  7C  AS  6H  3C  9H4S  7S 10H  2D  8S  AH
采样
许多模拟器需要来自一组输入值的模拟样本。sample()  函数用于生成不重复样本值,并且不改变输入序列。这个例子展示了从系统字典中打印随机样本单词。random_sample.pyimport randomwith open('/usr/share/dict/words', 'rt') as f:words = f.readlines()
words = [w.rstrip() for w in words]for w in random.sample(words, 5):print(w)
用于产生结果集的算法考虑了输入的大小和所请求的样本以尽可能有效地产生结果。$ python3 random_sample.pystreamlet
impestation
violaquercitrin
mycetoid
plethoretical$ python3 random_sample.pynonseditious
empyemic
ultrasonic
Kyurinish
amphide

多个同时生成器
除了模块级别的函数之外,random 包含了一个 Random 类管理集合随机数生成器的内部状态。前面描述的所有函数都可以作为 Random 实例的可用方法,并且每个实例可以被单独初始化使用,而不会影响其他实例的返回值。

random_random_class.pyimport random
import timeprint('Default initializiation:\n')r1 = random.Random()
r2 = random.Random()for i in range(3):print('{:04.3f}  {:04.3f}'.format(r1.random(), r2.random()))print('\nSame seed:\n')seed = time.time()
r1 = random.Random(seed)
r2 = random.Random(seed)for i in range(3):print('{:04.3f}  {:04.3f}'.format(r1.random(), r2.random()))

在一个具有良好原生随机值种子的系统上,实例以一个唯一状态运行。然而,如果没有好的平台随机数生成器,实例很可能被使用当前时间播种,然后就产生了相同的值。

$ python3 random_random_class.pyDefault initializiation:0.862  0.390
0.833  0.624
0.252  0.080Same seed:0.466  0.466
0.682  0.682
0.407  0.407

系统随机数
一些操作系统提供了一个随机数字生成器,它可以访问随机数生成器引入的更多熵源。random 通过 SystemRandom 暴露了这个功能,它和 Random 有相同的 API,但是使用 os.urandom() 生成构成其它算法基础的值。

random_system_random.pyimport random
import timeprint('Default initializiation:\n')r1 = random.SystemRandom()
r2 = random.SystemRandom()for i in range(3):print('{:04.3f}  {:04.3f}'.format(r1.random(), r2.random()))print('\nSame seed:\n')seed = time.time()
r1 = random.SystemRandom(seed)
r2 = random.SystemRandom(seed)for i in range(3):print('{:04.3f}  {:04.3f}'.format(r1.random(), r2.random()))

SystemRandom 生成的序列是不可预测的,因为随机性来源于系统,而不是软件(实际上,seed() 和 setstate() 对它都没有影响)。

$ python3 random_system_random.pyDefault initializiation:0.110  0.481
0.624  0.350
0.378  0.056Same seed:0.634  0.731
0.893  0.843
0.065  0.177

非均匀分布
虽然 random() 生成的均匀分布值可以用于大多数目的,但是其他分布可以更能精确地模拟特定情况。 random 模块也提供了生成这些分布的函数。他们被列在这里了,但是并没有详细覆盖,因为它们的使用趋向于特别的并且需要更复杂的案例。

正态分布
正态分布 通常用于非均匀分布的连续纸,例如,成绩,高度,宽度等。该分部生成的曲线具有独特的形状,导致他被叫做 「钟形曲线」。random 模块包含了两个生成正态分布值的函数,normalvariate() 和 略快的 gauss() (正太分布也被叫做高斯分布)。

相关函数 lognormvariate() 生成的伪随机值的对数符合正太分布。对数正态分布对于作为几个不相互作用的随机变量的乘积的值很有用。

近似分布
三角分布用于小样本量的近似分布。三角形分布的曲线在已知的最小和最大值处具有低点,并且在模式处具有高点,其基于最可能的结果( 由 triangular() 的模式参数反映)。

指数分布
expovariate() 生成一个指数分布,用于模拟均匀 Poisson 过程中的到达和间隔时间值,例如放射性衰减或者进入服务器的请求数。

Pareto 或者 幂等分布符合许多由 Long Tail 观察到的现象。paretovariate() 可以模拟个人资源分配(人们的财富,对音乐家的需求,对博客的关注等)。

Angular
Von Mises 或者 圆形正态分布(由 vonmisesvariate() 生成)用于计算循环值的概率,日历 T 天数和时间。

大小
betavariate() 使用 Beta 分布生成值,这通常用于贝叶斯统计和应用程序(如任务持续时间建模)。

gammavariate() 产生的 Gamma 分布用于模拟诸如等待时间,降雨量和计算误差之类事物的大小。

由 weibullvariate() 计算的 Weibull 分布用于故障分析,工业工程和天气预报。它描述了粒子或者其他离散对象的分布。

相关文章:

random — 伪随机数生成器(史上总结最全)

目的&#xff1a;实现几种类型的伪随机数生成器。 random 模块基于 Mersenne Twister 算法提供了一个快速的伪随机数生成器。Mersenne Twister 最初开发用于为蒙特卡洛模拟器生成输入&#xff0c;可生成具有分布均匀&#xff0c;大周期的数字&#xff0c;使其可以广泛用于各种…...

基于VBA实现成绩排序的最佳方法-解放老师的双手

作为一名老师&#xff0c;每到期末就要面对一件让人头疼的事情——成绩表统计。 首先&#xff0c;要收集每个学生的考试成绩。这需要花费大量的时间和精力&#xff0c;因为每个学生都有多门科目的成绩需要统计。 其次&#xff0c;要将每个学生的成绩录入到电子表格中。这看起来…...

OCAF如何实现引用关系和拓扑关系

在 OpenCASCADE 中,TDF_Label 是用来保存对象及其属性的基本单元。TDF_Label 可以通过添加不同类型的属性来保存不同的数据类型。属性是继承自 TDF_Attribute 类的对象,每个属性都有一个唯一的标识符(GUID)来识别其类型。TDF_Label是OpenCASCADE中用来管理数据的标签类,它…...

自动创建设备节点

在成功加载驱动模块之后&#xff0c;还需要使用 mknod命令创建设备节点&#xff0c;才能在/dev目录下创建对应的设备文件。自动创建设备节点的功能需要依赖 mdev 设备管理机制&#xff0c;在使用 buildroot 构建 rootfs 的时候&#xff0c;会默认构建 mdev 的功能&#xff0c;m…...

JavaWeb ( 六 ) JSP

2.4.JSP JSP (Java Server Pages) : 一种在服务器端生成动态页面的技术&#xff0c;本质上就是Servlet。将HTML代码嵌入到Java代码中, 通过Java逻辑控制HTML代码的结构从而生成页面。在MVC中通常担任视图层&#xff08;view&#xff09;&#xff0c;负责信息的展示与收集。 2…...

2023世界超高清视频产业发展大会博冠8K明星展品介绍

2023世界超高清视频产业发展大会博冠8K明星展品介绍&#xff1a; 一、博冠8K全画幅摄像机B1 这是一款面向广电应用的机型&#xff0c;可适配外场ENG制作轻量化需求&#xff0c;应用于8K单边机位、新闻、专题的拍摄工作&#xff0c;也可应用于体育转播、文艺节目等特殊机位及各…...

Map接口以及Collections工具类

文章目录 1.Map接口概述1.1 Map的实现类的结构1.2 Map中存储的key-value结构的理解1.3 HashMap的底层实现原理(以JDK7为例)1.4 Map接口的常用方法1.5 TreeMap1.6 Map实现类之五: Properties 1.Collections工具类1.1方法1.1.1 排序操作(均为static方法)1.1.2 查找、替换 1.Map接…...

SOA协议DDS和Some/IP对比

SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术&#xff0c;所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为&#xff1a;Scalable service-Oriented MiddlewarE over IP&#xff0c;是一种面向服务…...

Sass使用

前言&#xff1a; 这份记录&#xff0c;主要是记录学习sass的学习记录&#xff0c;用于记录一些本人认为可能以后会用到的比较常用的一些知识点&#xff0c;更详细的请看sass官网 功能1-嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中&#xff0c;内层的样式将它外层的…...

超大excel文件读,避免内存溢出

excel40M&#xff0c;但是用传统的读取excel方法&#xff0c;会报内存溢出的错误。 所以采用了下面的方式&#xff0c;能解决此问题&#xff1a; maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><ve…...

第0章 学习之前的准备

突然想写点关于linux的东西&#xff0c;一是将自己几十年来零碎的知识作以串联&#xff0c;二是能为正在学习路上的新手作些指引。而恰好作者的孩子是一位初一的学生&#xff0c;我写的这些东西也正是我手把手教授他的&#xff0c;现在分享出来并且命名为《linux中学教程》&…...

数组排序sort()方法

sort() 方法对数组的项目进行排序。 排序顺序可以是按字母或数字&#xff0c;也可以是升序&#xff08;向上&#xff09;或降序&#xff08;向下&#xff09;。 默认情况下&#xff0c;sort() 方法将按字母和升序将值作为字符串进行排序。 一、语法 array.sort(compareFunct…...

【.NET AI Books 前言】Azure OpenAI Service 入门

本书是为 .NET 开发者而写的&#xff0c;让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中&#xff0c;作为开发者你可能将面临几种改变&#xff1a; GPT 模型到来后&#xff0c;如何去架构好企业解决方案…...

散列查找实验(开散列) 题目编号:583

题目描述 请设计一个整型开散列表&#xff0c;散列函数为除留余数法&#xff0c;其中散列表的长度、除留余数法的模和关键码的个数由键盘输入&#xff0c;再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找&#xff0c;输出查找结果采用头插法。 输入描…...

Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

Go type关键字定义新类型和类型别名的区别

type关键字再定义类型和类型别名有很大的区别&#xff0c;前者是新定义一个数据类型&#xff0c;后者是对类型的重命名。 type NewString stringtype OldString stringtype NewString string声明了一个NewString类型&#xff0c;和string具有完全一致的数据结构&#xff0c;确…...

Neural Network学习笔记2

torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…...

用@Value注解为bean的属性赋值

1.Value注解 Value注解的源码&#xff0c;如下所示 Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface Value {String value(); }从Value注解的源码中…...

拨云见日:深入理解 HTML 解析器与有限状态机

文章目录 参考描述状态机状态机有限状态机与无限状态机有限状态机与自动售货机无限状态机与计算器 HTML 解析器HTML 解析器HTML 与有限状态机 HTML 解析器的常见状态初始状态DOCTYPE 状态注释状态标签状态开始标签状态属性状态属性名状态属性值状态 结束标签状态自闭和标签状态…...

Java线程池及其实现原理

线程池概述 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算机…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...