LeetCode-470. 用 Rand7() 实现 Rand10()【数学 拒绝采样 概率与统计 随机化】

LeetCode-470. 用 Rand7 实现 Rand10【数学 拒绝采样 概率与统计 随机化】

  • 题目描述:
  • 解题思路一:首先说一个结论就是`(rand_X() - 1) × Y + rand_Y() ==> [1,X*Y]`,即可以等概率的生成[1, X * Y]范围的随机数,其实就像军训的时候报数,Y是每一行的人数,X是列数【参考下面的图】。第二就是拒绝采样,效果是能够减少调用rand7()的调用次数。我们在利用`(rand_7() - 1) × 7 + rand_7() ==> [1,7*7]`得到rand49()的时候,我们希望能够等概率的生成[1,10]的随机数,那么可以拒绝掉大于40的数。即`if num<=40:`才进行采样。
  • 解题思路二:0
  • 解题思路三:0

题目描述:

给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。

你只能调用 rand7() 且不能调用其他方法。请不要使用系统的 Math.random() 方法。

每个测试用例将有一个内部参数 n,即你实现的函数 rand10() 在测试时将被调用的次数。请注意,这不是传递给 rand10() 的参数。

示例 1:
输入: 1
输出: [2]

示例 2:
输入: 2
输出: [2,8]

示例 3:
输入: 3
输出: [3,8,10]

提示:
1 <= n <= 105

进阶:
rand7()调用次数的 期望值 是多少 ?
你能否尽量少调用 rand7() ?

解题思路一:首先说一个结论就是(rand_X() - 1) × Y + rand_Y() ==> [1,X*Y],即可以等概率的生成[1, X * Y]范围的随机数,其实就像军训的时候报数,Y是每一行的人数,X是列数【参考下面的图】。第二就是拒绝采样,效果是能够减少调用rand7()的调用次数。我们在利用(rand_7() - 1) × 7 + rand_7() ==> [1,7*7]得到rand49()的时候,我们希望能够等概率的生成[1,10]的随机数,那么可以拒绝掉大于40的数。即if num<=40:才进行采样。

请添加图片描述
为了充分利用被拒绝的采样结果,即舍弃掉[41, 49]这9个数。我们可以使用a = num - 40得到rand9,从而可以得到(rand_9() - 1) × 7 + rand_7() ==> [1,9*7]得到rand63,从而对rand63进行采样。这样之后的就不难理解了。

# The rand7() API is already defined for you.
# def rand7():
# @return a random integer in the range 1 to 7class Solution:def rand10(self):""":rtype: int"""while True:a = rand7()b = rand7()num = (a-1)*7 + b # rand49if num<=40:return num%10 + 1a = num - 40 # rand9b = rand7()num = (a-1)*7 + b # rand63if num<=60:return num%10 + 1a = num - 60 # rand3b = rand7()num = (a-1)*7 + b # rand21if num<=20:return num%10 + 1

时间复杂度:期望时间复杂度为O(1),但最坏情况下会达到 (∞)(一直被拒绝)。
空间复杂度:O(1)
分析一下rand7()调用次数的 期望值:
首先调用2次得到a,b
然后拒绝采样一次概率是9/49
第二次是9/49 * 3/63
第三次是9/49 * 3/63 * 1/21就是进入下一轮while循环了。所以是一个等比数列。
a = 2 + 9 49 + 9 49 ⋅ 3 63 / / 是每次采样成功的概率 b = 9 49 ⋅ 3 63 ⋅ 1 21 / / 是每次进入下一轮循环的概率(等比数列的公比) E ( # c a l l ) = a ⋅ 1 1 − b ≈ 2.19333 \begin{align} a &= 2 + \frac{9}{49}+\frac{9}{49}·\frac{3}{63} \quad // \text{是每次采样成功的概率} \notag \\ b &= \frac{9}{49}·\frac{3}{63}·\frac{1}{21} \quad // \text {是每次进入下一轮循环的概率(等比数列的公比)} \notag \\ E(\#call) &= a·\frac{1}{1-b} \notag \\ &\approx 2.19333 \end{align} abE(#call)=2+499+499633//是每次采样成功的概率=499633211//是每次进入下一轮循环的概率(等比数列的公比)=a1b12.19333
所以期望次数是2.19332

解题思路二:0


解题思路三:0


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

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

相关文章

抖店怎么对接达人带货?达人渠道整理,实操详解!

我是电商珠珠 很多人在抖店开通后&#xff0c;按照流程去正常的跑自然流量&#xff0c;再去找达人带货让自己店铺的流量增多&#xff0c;得到相应的曝光。 但是一些新手小白并不知道从哪去找达人&#xff0c;或者说不知道怎么去筛选达人。 一开始所有人都想着去找头部主播&a…

MyBatis-Plus动态更改查询的表名或字段名

部分业务可能会需要根据参数不同而查询不同的表&#xff0c;或者查询不同的字段。使用MyBatis-Plus可以很方便地实现这种需求&#xff0c;甚至不需要使用.xml文件。 三张数据表user、user1、user2内容都如下&#xff1a; idnameagesex1张三1812李四<null><null>3&…

ubuntu启动kafka报错Could not create the Java Virtual Machine.

网上有两种方式&#xff0c;但是需要具体看自己的错误信息&#xff0c;我的错误信息如下: 这里大概是说要写入日志无权限&#xff0c;所以执行的时候&#xff0c;前面加一下sudo 执行成功。

反射(理论详细到不能详细,需要不断实践)

反射机制&#xff1a; 需求&#xff1a;从【外部】配置文件中获取 类名和方法名 将其运行-》只有反射可以实现 在不修改源码的情况下控制程序-》设计模式的ocp开闭原则 &#xff08;开&#xff1a;功能开放给你使用&#xff0c;闭&#xff1a;不让修改源码&…

阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?

10月23 日14:00左右&#xff0c;蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障&#xff0c;在线文档和官网都无法打开。直到当天晚上22:24&#xff0c;语雀服务才全部恢复正常。从故障发生到完全恢复正常&#xff0c;语雀整个宕机时间将近 8 小时&#xff0c;如此长…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 &#x1f339;简述Eureka&#x1f6f8;搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 &#x1f339;简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架&#xff0c;主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

机器学习与 S3 相集成 :释放数据的力量

文章作者&#xff1a;Libai 引言 在当今数据驱动的世界中&#xff0c;企业不断寻求如何高效利用企业自身所产生的数据的解决方案。机器学习已经成为一种提取有价值的见解和做出数据驱动决策的强大工具。然而&#xff0c;机器学习模型的成功在很大程度上依赖于高质量数据的可用…

算能技术资料地址、Demo github地址

技术资料地址&#xff1a; https://developer.sophgo.com/site/index/material/38/all.html Demo github地址&#xff1a;https://github.com/sophgo/sophon-demo

人工智能在警务工作中的运用

AI 能否帮助警察打击犯罪&#xff1f; 执法部门负责维护公共安全&#xff0c;他们必须处理随之而来的所有挑战。幸运的是&#xff0c;警察可以依靠技术来处理很多工作。近几年来&#xff0c;尤其是人工智能技术在全球变成了警务工作中的一个重要部分。 随着基于 AI 的警务技术…

java-poi操作笔记

row表示行&#xff0c;cell表示row中的第几个cell package sample.Utils;import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Workbook; impor…

c++搭建http服务器

HTTP请求协议格式如下&#xff1a; HTTP响应协议格式如下&#xff1a; #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <string>#pragma comment(lib, "ws2_32.lib")//std::string generateResponse(const st…

企业级SQL开发:如何审核发布到生产环境的SQL性能

自从上世纪 70 年代数据库开始普及以来&#xff0c;DBA 们就不停地遭遇各种各样的数据库管理难题&#xff0c;其中最为显著的&#xff0c;可能就是日常的开发任务中&#xff0c;研发人员们对于核心库进行变更带来的一系列风险。由于针对数据库的数据变更是一项非常常见的任务&a…

C#-关于网络

操作IP地址、执行DNS查询。。。 使用套接字编程&#xff1b; 创建TCp和UDP客户端和服务器 使用HttpClient及其工厂&#xff1b;

python文件docx转pdf

centos部署的django项目&#xff0c;使用libreoffice做文件转换&#xff0c;官网给环境安装好libreoffice后&#xff0c;可使用命令行来进行转化 还可转换其他的各种格式&#xff0c;本文只做了pdf转换 import subprocess import os def convert_to_pdf(input_file, o…

Linux修改时区失败,手动修改localtime无效

有时候改了这个也不行&#xff0c;用命令行修改也不行 解决办法 &#xff1a;cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 或者想改其他时区的直接 ll /usr/share/zoneinfo/ 查看

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor&#xff0c;受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT&#xff…

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

Flask下载文件接口,以excl表哥为例

一、response 1、定义写入表哥的代码 def create_excel_xls(path, sheet_name, value):index len(value) # 获取需要写入数据的行数workbook xlwt.Workbook() # 新建一个工作簿sheet workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格for i in range(0, inde…

使用Redis做数据缓存

目的 本关目的&#xff1a;使用Redis实现数据缓存。 相关知识 本文将将会你掌握&#xff1a;1&#xff0e;将数据加入缓存队列&#xff0c;2&#xff0e;缓存数据。 在我之前的文章中提到了实现了使用 Redis 做动态页面缓存&#xff0c;以此提高访问速度&#xff0c;但同时…

【AntDB 数据库】国产数据库发展之信创政策的加持

由于我国在信息技术领域起步较晚&#xff0c;国内大量的市场份额被国际IT巨头占据&#xff0c;甚至长期处于被垄断的地位&#xff0c;这也给了某些国家妄图通过挑起科技、贸易摩擦制衡我国发展的机会。为了解决可能存在的安全风险&#xff0c;在重要信息系统、关键基础设施中使…