随机数生成算法:K进制逐位生成+拒绝采样

随机数生成算法:K进制逐位生成+拒绝采样

转自:【宫水三叶】k 进制诸位生成 + 拒绝采样

基本分析

给定一个随机生成 1 ~ 7 的函数,要求实现等概率返回 1 ~ 10 的函数。

首先需要知道,在输出域上进行定量整体偏移,仍然满足等概率,即要实现 0 ~ 6 随机器,只需要在 rand7 的返回值上进行 -1 操作即可。

但输出域的 拼接/叠加 并不满足等概率。例如 rand7() + rand7() 会产生 [2, 14] 范围内的数,但每个数并非等概率:

  • 产生 2 的概率为:17×17=149\frac{1}{7}\times\frac{1}{7}=\frac{1}{49}71×71=491
  • 产生 4 的概率为:17×17+17×17+17×17=349\frac{1}{7}\times\frac{1}{7}+\frac{1}{7}\times\frac{1}{7}+\frac{1}{7}\times\frac{1}{7}=\frac{3}{49}71×71+71×71+71×71=493

在 [2,14] 这 13 个数中,等概率的数不足 10 个。

因此,你应该知道「执行两次 rand7 相加,将 [1, 10] 范围内的数进行返回,否则一直重试」的做法是错误的。

k进制逐位生成 + 拒绝采样

上述做法出现概率分布不均的情况,是因为两次随机值的不同组合「相加」的会出现相同的结果,比如 (1, 3)、(2, 2)、(3, 1) 最终结果均为 4。

结合每次执行 rand7 都可以看作一次独立事件。我们可以将两次 rand7 的结果看作生成 7 进制的两位。从而实现每个数值都唯一对应了一种随机值的组合(等概率),反之亦然。

举个例子,设随机执行两次 rand7 得到的结果分别是 4(第一次)、7(第二次),由于我们是要 7 进制的数,因此可以先对 rand7 的执行结果进行 -1 操作,将输出域偏移到 [0,6](仍为等概率),即得到 3(第一次)和 6(第二次),最终得到的是数值 (63)7(63)_7(63)7 ,数值 (63)7(63)_7(63)7 唯一对应了我们的随机值组合方案,反过来随机值组合方案也唯一对应一个 7 进制的数值。

那么根据「进制转换」的相关知识,如果我们存在一个 randK 的函数,对其执行 nnn 次,我们能够等概率产生 [0,Kn−1][0, K^n - 1][0,Kn1] 范围内的数值。

回到本题,执行一次 rand7 只能产生 [0,6] 范围内的数值,不足 10 个;而执行 2 次 rand7 的话则能产生 [0, 48] 范围内的数值,足够 10 个,且等概率。

我们只需要判定生成的值是否为题意的 [1, 10] 即可,如果是的话直接返回,否则一直重试。

代码:

class Solution {
public:int rand10() {while (1) {int r71 = rand7();int r70 = rand7();int val = (r71 - 1) * 7 + r70 - 1;if (val >= 1 && val <= 10) return val;}}
};
  • 时间复杂度:期望复杂度为 O(1),最坏情况下为 O(∞\infty)
  • 空间复杂度:O(1)

进阶

降低对 rand7 的调用次数

我们发现,在上述解法中,范围 [0, 48] 中,只有 [1, 10] 范围内的数据会被接受返回,其余情况均被拒绝重试。

为了尽可能少的调用 rand7 方法,我们可以从 [0, 48] 中取与 [1, 10] 成倍数关系的数,来进行转换。

我们可以取 [0, 48] 中的 [1, 40] 范围内的数来代指 [1, 10]。

首先在 [0, 48] 中取 [1, 40] 仍为等概率,其次形如 x1 的数值有 4 个(1、11、21、31),形如 x2 的数值有 4 个(2、12、22、32)… 因此最终结果仍为等概率。

代码:

class Solution {
public:int rand10() {while (1) {int r71 = rand7();int r70 = rand7();int val = (r71 - 1) * 7 + r70 - 1;if (val >= 1 && val <= 40) return val % 10 + 1;}}
};

时间复杂度:期望复杂度为 O(1),最坏情况下为 O(∞\infty)
空间复杂度:O(1)

计算 rand7 的期望调用次数

在 [0, 48] 中我们采纳了 [1, 40] 范围内的数值,即以调用两次为基本单位的话,有 4049\frac{40}{49}4940 的概率被接受返回(成功)。

成功的概率为 4049\frac{40}{49}4940 ,那么触发成功所需次数(期望次数)为其倒数 4940=1.225\frac{49}{40} = 1.2254049=1.225,每次会调用两次 rand7,因而总的期望调用次数为 1.225∗2=2.451.225 * 2 = 2.451.2252=2.45

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解NLP Subword算法:BPE、WordPiece、ULM

深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 本文首发于微信公众号【AI充电站】&#xff0c;感谢大家的赞同、收藏和转发(▽) 转自&#xff1a;深入理解NLP Subword算法&#xff1a;BPE、WordPiece、ULM 前言 Subword算法如今已经成为了一个重要的NLP模型性能提升…

http 错误 404.0 - not found_电脑Regsvr32 用法和错误消息的说明

​ 对于那些可以自行注册的对象链接和嵌入 (OLE) 控件&#xff0c;例如动态链接库 (DLL) 文件或 ActiveX 控件 (OCX) 文件&#xff0c;您可以使用 Regsvr32 工具 (Regsvr32.exe) 来将它们注册和取消注册。Regsvr32.exe 的用法RegSvr32.exe 具有以下命令行选项&#xff1a; Regs…

mysql error 1449_MySql错误:ERROR 1449 (HY000)

笔者系统为 mac &#xff0c;不知怎的&#xff0c;Mysql 竟然报如下错误&#xff1a;ERROR 1449 (HY000): The user specified as a definer (mysql.infoschemalocalhost) does not exist一时没有找到是什么操作导致的这个错误。然后经过查询&#xff0c;参考文章解决了问题。登…

MobileNet 系列:从V1到V3

MobileNet 系列&#xff1a;从V1到V3 转自&#xff1a;轻量级神经网络“巡礼”&#xff08;二&#xff09;—— MobileNet&#xff0c;从V1到V3 自从2017年由谷歌公司提出&#xff0c;MobileNet可谓是轻量级网络中的Inception&#xff0c;经历了一代又一代的更新。成为了学习轻…

mysql 查询表的key_mysql查询表和字段的注释

1,新建表以及添加表和字段的注释.create table auth_user(ID INT(19) primary key auto_increment comment 主键,NAME VARCHAR(300) comment 姓名,CREATE_TIME date comment 创建时间)comment 用户信息表;2,修改表/字段的注释.alter table auth_user comment 修改后的表注…

mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

作为运维和编程人员&#xff0c;对MySQL一定不会陌生&#xff0c;尤其是互联网行业&#xff0c;对MySQL的使用是比较多的。MySQL 作为主流的数据库&#xff0c;是各大厂面试官百问不厌的知识点&#xff0c;但是需要了解到什么程度呢&#xff1f;仅仅停留在 建库、创表、增删查改…

teechart mysql_TeeChart 的应用

TeeChart 是一个很棒的绘图控件&#xff0c;不过由于里面没有注释&#xff0c;网上相关的资料也很少&#xff0c;所以在应用的时候只能是一点点的试。为了防止以后用到的时候忘记&#xff0c;我就把自己用到的东西都记录下来&#xff0c;以便以后使用的时候查询。1、进制缩放图…

NLP新宠——浅谈Prompt的前世今生

NLP新宠——浅谈Prompt的前世今生 转自&#xff1a;NLP新宠——浅谈Prompt的前世今生 作者&#xff1a;闵映乾&#xff0c;中国人民大学信息学院硕士&#xff0c;目前研究方向为自然语言处理。 《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in…

mysql key_len_浅谈mysql explain中key_len的计算方法

mysql的explain命令可以分析sql的性能&#xff0c;其中有一项是key_len(索引的长度)的统计。本文将分析mysql explain中key_len的计算方法。1、创建测试表及数据CREATE TABLE member (id int(10) unsigned NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,age tinyint(…

requestfacade 这个是什么类?_Java 的大 Class 到底是什么?

作者在之前工作中&#xff0c;面试过很多求职者&#xff0c;发现有很多面试者对Java的 Class 搞不明白&#xff0c;理解的不到位&#xff0c;一知半解&#xff0c;一到用的时候&#xff0c;就不太会用。想写一篇关于Java Class 的文章&#xff0c;没有那么多专业名词&#xff0…

初学机器学习:直观解读KL散度的数学概念

初学机器学习&#xff1a;直观解读KL散度的数学概念 转自&#xff1a;初学机器学习&#xff1a;直观解读KL散度的数学概念 译自&#xff1a;https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解读…

php mysql读取数据查询_PHP MySQL 读取数据

PHP MySQL 读取数据从 MySQL 数据库读取数据SELECT 语句用于从数据表中读取数据:SELECT column_name(s) FROM table_name我们可以使用 * 号来读取所有数据表中的字段&#xff1a;SELECT * FROM table_name如需学习更多关于 SQL 的知识&#xff0c;请访问我们的 SQL 教程。使用 …

MySQL应用安装_mysql安装和应用

1.下载mysql安装包2.安装mysql&#xff0c;自定义->修改路径3.配置mysql&#xff0c;选择自定义->server模式->500访问量->勾选控制台->设置gbk->设置密码和允许root用户远程登录等等。以管理员权限&#xff0c;在控制台输入&#xff1a;net start MySQL, 启…

mysql 商品规格表_商品规格分析

产品表每次更新商品都会变动的&#xff0c;ID不能用&#xff0c;可是购物车还是用了&#xff0c;这就导致每次保存商品&#xff0c;哪怕什么都没有改动&#xff0c;也会导致用户的购物车失效。~~~其实可以考虑不是每次更新商品就除所有的SKU&#xff0c;毕竟有时什么都没修改呢…

mysql维表的代理键字段_mysql多维数据仓库指南--第三篇第12章(2)

宾夕法尼亚州地区客户维在本节我将用宾夕法尼亚州地区客户的子集维度来解释第二种维度子集的类型。我也将向你说明如何测试该子集维度。相对的&#xff0c;一个向上钻取的维包含了它基础维的所有更高级别的数据。而一个特定子集维度则选择了它基础维的某个特定的数据集合。列表…

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1&#xff1a;Transformers模型 原文&#xff1a;TRANSFORMER MODELS 本课程会通过 Hugging Face 生态系统中的一些工具包&#xff0c;包括 Transformers&#xff0c; Datasets&#xff0c; Tokenizers&#xff0c; Accelerate 和 Hugging Face Hub。…

mysql日期比较timestamp_Mysql中的Datetime和Timestamp比较(转载)

mysql中用于表示时间的三种类型date, datetime, timestamp (如果算上int的话&#xff0c;四种) 比较容易混淆&#xff0c;下面就比较一下这三种类型的异同相同点都可以用于表示时间都呈字符串显示不同点1.顾名思义&#xff0c;date只表示YYYY-MM-DD形式的日期&#xff0c;datet…

隐马尔可夫模型HMM推导

隐马尔可夫模型HMM推导 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM&#xff08;Hidden Markov Model&#xff09; 课程笔记 背景介绍 介绍一下频率派和贝叶斯派两大流派发展出的建模方式。 频率派 频率派逐渐发展成了统计机器学习&#xff0c;该流派通常将任务建模为一…

ef mysql 的坑_C# EF 与 MySql 的那些坑

之前一直想用 mysql 和 ef 。然后多次尝试也只能感叹 还是 sqlsever 是亲儿子。今天在单位又尝试了一次&#xff0c;然后就成功了&#xff0c;记录一下遇到的问题。首先是安装包和驱动&#xff1f;。请保证 MySql.Data / MySql.Data.Entity.EF6 / mysql Connector/NET 版本对应…

使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...

Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。数据流是一串连续不断的数据的集合&#xff0c;就象水管里的水流&#xff0c;在水管的一端一点一点地供水…