LeetCode面试题解析:用Rand7()实现Rand10()的算法与优化
1. 问题背景与需求分析这道LeetCode经典面试题要求我们仅用Rand7()这个生成1-7均匀随机数的函数构造出Rand10()函数生成1-10的均匀随机数。看似简单的需求背后实际上考察了几个关键知识点基础概率论应用均匀分布的性质拒绝采样(Rejection Sampling)方法算法效率优化最小化Rand7()调用次数位运算的巧妙运用在实际面试中类似问题经常出现在Google、Facebook等大厂的算法轮次。我曾在某次技术面试中遇到变种题目用Rand5()实现Rand7()当时因为没有系统研究过这类问题而表现不佳后来专门对此类问题进行了深入研究。2. 基础解法与概率分析2.1 直观思路与问题最直观的想法可能是def rand10(): return rand7() rand7() % 4但这种写法存在明显问题结果范围是1-10但各数字出现概率不均等例如数字1只能通过(10)得到而数字5可以通过(14)、(23)、(32)、(41)、(50)多种组合关键点必须确保1-10每个数字出现的概率严格等于1/102.2 拒绝采样基础实现标准解法是采用拒绝采样策略def rand10(): while True: num (rand7() - 1) * 7 rand7() # 1-49 if num 40: return num % 10 1原理分析(rand7()-1)*7生成0,7,14,21,28,35,42均匀分布再加rand7()得到1-49的均匀分布只取1-40的值拒绝41-49对10取模得到0-9加1即为1-10效率分析每次循环成功概率40/49 ≈ 81.63%期望调用Rand7()次数2/(40/49) 2.45次3. 优化方案与数学证明3.1 利用拒绝样本提高效率可以进一步利用被拒绝的样本41-49def rand10(): while True: a rand7() - 1 b rand7() - 1 num a * 7 b # 0-48 if num 40: return num % 10 1 # 利用剩余样本40-48 a num - 40 # 0-8 b rand7() - 1 # 0-6 num a * 7 b # 0-62 if num 60: return num % 10 1 # 继续利用剩余样本60-62 a num - 60 # 0-2 b rand7() - 1 # 0-6 num a * 7 b # 0-20 if num 20: return num % 10 1优化效果首次成功概率40/49 ≈ 81.63%二次成功概率9/49 * 60/63 ≈ 17.46%三次成功概率9/49 * 3/63 * 20/21 ≈ 0.89%期望调用次数降至约2.212次Rand7()3.2 数学期望严格证明定义随机变量X为所需Rand7()调用次数其期望E[X]计算如下E[X] 2*(40/49) 4*(9/49)(60/63) 6(9/49)(3/63)(20/21) (递归部分可忽略高阶小量) ≈ 2.212这比基础方案的2.45次有显著提升。4. 位运算优化技巧4.1 二进制位利用法观察到7和10的二进制表示7 011110 1010可以构造基于位的随机数生成def rand10(): while True: # 生成3位二进制数0-7 bits (rand7() 1) 2 | (rand7() 1) 1 | (rand7() 1) if bits 10: return bits 1特点每次尝试需要3次Rand7()调用成功概率10/1662.5%期望调用次数3/(10/16)4.8次效率较低4.2 混合位运算方案结合拒绝采样和位运算def rand10(): while True: # 首先生成0-15的均匀分布 num (rand7() 1) 3 | (rand7() 1) 2 | (rand7() 1) 1 | (rand7() 1) if 1 num 10: return num elif num 0: continue else: # 对11-15减去10得到1-5 return num - 105. 测试验证与边界情况5.1 验证均匀性的测试代码from collections import defaultdict def test_rand10(): counts defaultdict(int) test_times 100000 for _ in range(test_times): counts[rand10()] 1 for num in range(1, 11): print(f{num}: {counts[num]/test_times:.4f}) # 期望每个数字出现概率≈0.15.2 边界情况处理确保不会返回0或10的数字处理rand7()返回值范围确保是1-7整数溢出问题Python无需考虑但其他语言需要注意6. 实际面试中的变种问题6.1 常见变种题型用Rand5()实现Rand7()用RandN()实现RandM()非均匀随机数生成器的转换6.2 通用解法框架找到最小的k使得N^k M生成[0, N^k-1]范围内的均匀分布拒绝采样直到结果落在[0, M-1]范围内返回结果16.3 效率优化原则最大化接受概率尽可能复用被拒绝的样本考虑位运算等优化手段7. 工程实践中的注意事项随机数质量确保基础Rand7()是真正的均匀分布性能考量在性能敏感场景选择调用次数更少的方案可读性权衡优化方案往往牺牲可读性需根据场景选择测试覆盖必须验证输出分布的均匀性线程安全如果Rand7()有状态需要考虑同步问题我在实际项目中曾遇到过需要生成特定范围随机数的需求最终采用了类似拒绝采样的方案。经过测试发现当拒绝概率较高时如用Rand5()实现Rand7()算法的实际性能会成为瓶颈。这时可以考虑预生成随机数池的方案来优化性能。

相关新闻

多智能体建模在支付系统压力测试与流动性风险分析中的应用

多智能体建模在支付系统压力测试与流动性风险分析中的应用

1. 项目概述:当支付系统“压力山大”时,我们如何建模信任与流动性?想象一下,一个繁忙的周五下午,你正准备通过手机银行给供应商转账支付一笔关键款项,却发现系统提示“交易处理延迟”。与此同时&#xff0c…

2026/8/21 22:53:07 阅读更多 →
【寻迹校园 HarmonyOS NEXT 实战 20】标准值与历史文本共存:分类词表升级时如何避免静默改坏旧数据

【寻迹校园 HarmonyOS NEXT 实战 20】标准值与历史文本共存:分类词表升级时如何避免静默改坏旧数据

【寻迹校园 HarmonyOS NEXT 实战 20】标准值与历史文本共存:分类词表升级时如何避免静默改坏旧数据这是“寻迹校园 HarmonyOS NEXT 实战”系列第 20 篇。本文结合 ReportTaxonomy.ets 与发布表单的编辑恢复逻辑,说明新建记录如何只写权威分类和地点&…

2026/8/23 1:05:57 阅读更多 →
MATLAB R2021a 完整安装与避坑指南:从系统准备到实战验证

MATLAB R2021a 完整安装与避坑指南:从系统准备到实战验证

MATLAB 安装失败,可能是你踩中了这五个“隐形”的坑。对于科研人员、工程师和学生来说,MATLAB 远不止一个数学计算软件,它是算法验证、数据分析、系统仿真的核心工具。然而,从下载、安装到成功激活,每一步都可能遇到许…

2026/8/23 1:05:57 阅读更多 →

最新新闻

PXE-E61报错全解析:从启动顺序调整到系统引导修复

PXE-E61报错全解析:从启动顺序调整到系统引导修复

1. 项目概述:PXE-E61报错,不只是启动顺序那么简单如果你在开机时,屏幕上突然跳出“PXE-E61: Media test failure, check cable”或者类似的提示,然后电脑就卡住不动了,别慌,这绝对不是你的硬盘坏了。这个看…

2026/8/23 1:05:16 阅读更多 →
WebService接口调用实战:从SOAP协议解析到C#/Java/ABAP全流程指南

WebService接口调用实战:从SOAP协议解析到C#/Java/ABAP全流程指南

1. 项目概述:从“亲测有效”说起 看到“webService接口调用(亲测有效)”这个标题,很多开发者,尤其是刚接触企业级系统对接的朋友,估计都会会心一笑。这背后反映的是一个非常普遍且现实的痛点:在文档不全、环境复杂、协…

2026/8/23 1:05:16 阅读更多 →
BoringSSL:一个为 Chrome 与 Android 而生的轻量 TLS 加密库

BoringSSL:一个为 Chrome 与 Android 而生的轻量 TLS 加密库

BoringSSL:一个为 Chrome 与 Android 而生的轻量 TLS 加密库 【免费下载链接】boringssl Mirror of BoringSSL 项目地址: https://gitcode.com/gh_mirrors/bo/boringssl BoringSSL 是 Google 维护的轻量级 TLS(传输层安全协议)加密库&…

2026/8/23 1:05:16 阅读更多 →
WireShark从入门到实战:网络抓包与协议分析全攻略

WireShark从入门到实战:网络抓包与协议分析全攻略

在实际网络开发、运维和安全分析工作中,我们经常需要知道数据包在网络中究竟是如何流动的。无论是排查一个API接口调用失败,分析一个网络延迟问题,还是学习一个协议的具体交互过程,仅仅看应用层日志是远远不够的。这时&#xff0c…

2026/8/23 1:05:16 阅读更多 →
深入Git底层原理:从对象模型到合并推拉,彻底掌握版本控制

深入Git底层原理:从对象模型到合并推拉,彻底掌握版本控制

1. 项目概述:为什么你需要理解Git的“内脏”干了这么多年开发,我见过太多人把Git用成了“黑箱魔法”。每天敲着git pull、git merge、git push,代码冲突了就手足无措,回退版本像在玩扫雷,一不小心就把团队仓库搞炸。问…

2026/8/23 1:05:16 阅读更多 →
旧电脑焕新指南:Linux与统信UOS系统安装实战

旧电脑焕新指南:Linux与统信UOS系统安装实战

1. 从“电子垃圾”到“生产力工具”的认知转变 家里那台开机要等三分钟,打开浏览器就卡死的旧电脑,是不是已经让你彻底失去了耐心?很多人面对这种情况,第一反应就是“该换了”,然后这台旧设备最终的归宿,往…

2026/8/23 1:04:15 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →