LeetCode 470 用 Rand7() 实现 Rand10()


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 第一步:为什么是 `(rand7() - 1) * 7 + rand7()`
      • 第二步:为什么只取 `[1,40]`
      • 第三步:为什么不会死循环
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 470 这道题乍一看像是“随机数题”,但真正考的并不是 API 调用,而是**对概率、均匀分布以及拒绝采样(Rejection Sampling)**的理解。
题目限制只能用rand7(),却要生成rand10(),这类问题在工程里并不少见,比如基于受限随机源做更高维度的随机模拟、灰度实验、AB 测试分流等。

这篇文章会从直觉误区开始,一步步推到正确解法,并用 Swift 写出一个可以直接跑的 Demo,顺便聊聊它在真实系统里的意义。

描述

题目给了一个现成的方法:

rand7() -> 返回 [1, 7] 之间的均匀随机整数

我们的目标是实现:

rand10() -> 返回 [1, 10] 之间的均匀随机整数

限制条件很严格:

  • 只能调用rand7()
  • 不能使用系统随机函数
  • 要求结果是均匀分布

很多人第一反应是:

“那我rand7() % 10 + 1不就行了?”

这个想法非常自然,但也是这道题的第一个坑。
因为7 不能整除 10,直接取模一定会导致某些数字出现的概率更高。

所以问题的本质其实是:

如何把一个有限、离散、范围不整除的随机源,映射成另一个均匀随机源?

题解答案

核心思路只有一句话:

rand7()组合出一个更大的均匀空间,再从中“筛选”出[1,10]

具体做法是:

  1. 用两次rand7()生成一个[1,49]的均匀随机数
  2. 只保留[1,40]这一段
  3. 对 10 取模,映射到[1,10]

为什么是 40?
因为40小于等于 49 的最大、能被 10 整除的数

题解代码分析

下面是一个完整、可运行的 Swift Demo,包含rand7()的模拟实现,方便本地测试。

classSolution{// 模拟题目给定的 rand7()funcrand7()->Int{returnInt.random(in:1...7)}// 目标函数funcrand10()->Int{whiletrue{// 将 rand7() 扩展成 [1, 49]letnum=(rand7()-1)*7+rand7()// 只接受 [1, 40]ifnum<=40{return(num-1)%10+1}// 超过 40 的部分直接丢弃,重新来}}}

下面我们一行一行拆解这段逻辑。

第一步:为什么是(rand7() - 1) * 7 + rand7()

你可以把它想象成一个二维表:

  • 第一次rand7()决定“行”
  • 第二次rand7()决定“列”

这样一来:

  • 一共 7 × 7 = 49 种组合
  • 每一种组合出现的概率完全相等

结果自然就是一个均匀分布的[1,49]

第二步:为什么只取[1,40]

这是这道题最关键的地方。

  • 49 不能整除 10
  • 40 可以整除 10

如果我们只使用[1,40],那么:

  • 每个数字 1~10 都对应4 个等概率来源
  • 映射后仍然是均匀分布

剩下的[41,49]呢?

答案是:
不要了,直接重来。

这就是经典的拒绝采样(Rejection Sampling)

第三步:为什么不会死循环

很多人担心:

“一直 reject,会不会一直跑不出来?”

实际上不会。

  • 接受概率是40 / 49
  • 平均不到 1.25 次循环就能成功一次

在进阶问题里,这正是题目希望你分析的“期望调用次数”。

示例测试及结果

我们可以简单写个测试,看看分布是不是均匀的。

letsolution=Solution()varcounter=Array(repeating:0,count:10)lettimes=100_000for_in0..<times{letvalue=solution.rand10()counter[value-1]+=1}foriin0..<10{print("Number\(i+1):\(counter[i])")}

你会看到类似这样的输出(每次略有波动):

Number 1: 10021 Number 2: 9958 Number 3: 10044 Number 4: 10003 Number 5: 10012 Number 6: 9987 Number 7: 10031 Number 8: 9996 Number 9: 10019 Number 10: 9929

从结果上看,每个数字的出现次数都非常接近,说明分布是均匀的。

时间复杂度

单次rand10()

  • 平均调用rand7()的次数是常数级
  • 接受概率是40 / 49

所以:

  • 时间复杂度是 O(1)(期望意义下)

这也是为什么这种“看起来有循环”的写法,在随机问题中是完全可以接受的。

空间复杂度

  • 没有使用额外的数据结构
  • 只用了几个临时变量

所以:

  • 空间复杂度是 O(1)

总结

LeetCode 470 表面上是一个随机数题,实际上考的是三件事:

  1. 你是否真正理解“均匀分布”
  2. 你能不能跳出“取模”的直觉陷阱
  3. 你是否知道如何通过拒绝采样构造新概率空间

在真实业务里,这类思路经常用在:

  • 灰度发布中的流量均匀分桶
  • 基于有限随机源的模拟系统
  • 游戏、推荐系统里的概率控制

如果你能把这道题讲清楚,说明你对“概率 + 工程实现”这件事,已经不是停留在表面了。

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

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

相关文章

CES 2026 | 重大更新:NVIDIA DGX Spark开启“云边端”模式

作者&#xff1a;毛烁算力日益增长的需求与数据搬运效率之间的矛盾&#xff0c;在过去两年尤为尖锐。当开源模型的参数量级迈过 100B&#xff08;千亿&#xff09;门槛&#xff0c; MoE&#xff08;混合专家&#xff09;架构成为主流&#xff0c;数百万开发者和科研人员尴尬地发…

es客户端查询DSL在日志系统中的应用:全面讲解

如何用好ES客户端与DSL&#xff0c;在日志系统中实现高效精准查询 在微服务和云原生架构大行其道的今天&#xff0c;一个中等规模的系统每天产生的日志动辄数GB甚至TB级。传统的“ grep 日志文件”模式早已不堪重负——你不可能登录十几台机器去翻滚动日志&#xff0c;更别提…

WaitMutex -FromMsBuild -architecture=x64”已退出,代码为 6

c 编译时报错&#xff1a;命令“"D:\Program Files\Epic Games\UE_5.6\Engine\Build\BatchFiles\Build.bat" demo_56_cEditor Win64 Development -Project"D:\projcect\ue_3d\demo_56_c\demo_56_c.uproject" -WaitMutex -FromMsBuild -architecturex64”已…

通俗解释nmodbus4在自动化产线中的角色

一条产线的“翻译官”&#xff1a;nmodbus4如何让上位机听懂PLC的语言 在一家智能制造工厂的中央控制室里&#xff0c;工程师小李正盯着大屏上跳动的数据流——温度、压力、电机转速……这些来自几十台设备的信息&#xff0c;最终都汇聚到他开发的一套.NET工控软件中。而连接这…

工业现场声音报警实现:有源蜂鸣器和无源区分手把手教程

工业现场声音报警实现&#xff1a;有源蜂鸣器和无源区分手把手教程从一个“不响的蜂鸣器”说起上周&#xff0c;一位做PLC扩展模块的工程师在群里发问&#xff1a;“我板子上的蜂鸣器怎么就是不响&#xff1f;电压测了有&#xff0c;IO也翻转了&#xff0c;代码没问题……”很快…

Gmail新增Gemini驱动AI功能,智能优先级和摘要来袭

谷歌公司正在对Gmail进行全面改革&#xff0c;将Gemini驱动的人工智能功能深度整合到其旗舰邮件服务中&#xff0c;力图将其转变为"个人、主动的收件箱助手"。今日推出的这些更新代表着谷歌迄今为止最积极推动AI自动化常态化的举措之一&#xff0c;可能会升级与微软公…

【Zabbix 多渠道报警全攻略(附图文教程):钉钉 / 企微 / 飞书 / 邮箱配置,含前置环境搭建(监控项、触发器、脚本与动作创建)、完整配置流程(脚本添加、媒介创建、关联授权)与功能测试】

提示&#xff1a;本文原创作品&#xff0c;良心制作&#xff0c;干货为主&#xff0c;简洁清晰&#xff0c;一看就会 Zabbix钉钉/企微/飞书/邮箱报警一、前置环境1.1 实验环境介绍1.2 创建监控项1.3 创建触发器1.4 创建脚本1.5 创建动作1.6 测试nginx能否重启二、钉钉报警2.1 创…

逻辑回归中的条件概率

这个式子 读作&#xff1a;“在已知 x 的条件下&#xff0c;y1 的概率”。 1) 每个符号分别是什么意思&#xff1f; y&#xff1a;要预测的“标签/结果”。 在二分类里通常 y∈{0,1}。 例&#xff1a;垃圾邮件 y1&#xff0c;正常邮件 y0。 x&#xff1a;输入特征&#xff08;…

从零实现:搭建ARM64蓝屏调试环境并进行WinDbg分析

手把手搭建ARM64蓝屏调试环境&#xff1a;从零开始用WinDbg定位系统崩溃你有没有遇到过这样的场景&#xff1f;一台搭载骁龙处理器的Windows on ARM笔记本突然蓝屏&#xff0c;重启后只留下一个MEMORY.DMP文件&#xff0c;而你面对这个“黑盒”毫无头绪。更糟的是&#xff0c;网…

DevicePairingFolder.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

研究发现商业AI模型可完整还原《哈利·波特》原著内容

机器学习模型&#xff0c;特别是商业模型&#xff0c;通常不会公开开发者用于训练的数据集。然而&#xff0c;模型包含哪些内容以及这些材料是否能通过特定提示被提取出来&#xff0c;仍然是具有经济和法律后果的重要问题&#xff0c;更不用说伦理和隐私方面的考量。 Anthropic…

DDACLSys.dll文件丢失找不到问题 免费下载分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

Pspice在OrCAD Capture中的仿真探针使用深入解析

Pspice仿真探针实战指南&#xff1a;如何在OrCAD Capture中精准捕获电路行为你有没有遇到过这样的场景&#xff1f;花了半小时搭好一个Buck电路&#xff0c;信心满满地跑完瞬态仿真&#xff0c;结果打开波形一看——关键节点没监控、电流纹波看不见、效率曲线还得手动算。更糟的…

ddodiag.exe文件丢失找不到问题 免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

从零实现AUTOSAR NM报文唤醒的软件配置

AUTOSAR NM报文唤醒&#xff1a;从配置到落地的完整实践指南你有没有遇到过这样的场景&#xff1f;整车钥匙未插入&#xff0c;但某个车门模块却频繁“醒来”&#xff0c;继而耗尽蓄电池&#xff1b;或者遥控解锁时响应迟钝&#xff0c;排查半天才发现是网络管理状态没对齐。这…

UVC协议实现高清视频传输:项目应用详解

UVC协议如何让高清视频“即插即用”&#xff1f;一个嵌入式工程师的实战笔记你有没有遇到过这样的场景&#xff1a;花了几千块买的专业摄像头&#xff0c;插上电脑却还要装一堆驱动&#xff1b;或者在Linux板子上调了三天图像采集程序&#xff0c;结果换到Windows又得重来一遍&…

dll一键修复工具 dll运行库修复工具下载

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

Razer在2026年CES展会推出全息AI伴侣项目

去年Razer展示了Project Ava数字助手&#xff0c;它生活在你的电脑中帮助调整设置或提供游戏建议。但现在在2026年CES展会上&#xff0c;该公司的AI伴侣平台获得了重大升级&#xff0c;同时搬入了新的"住所"。现在&#xff0c;Project Ava不再完全局限于你的PC屏幕&a…

独立IP服务器有哪些常见的应用场景?

独立IP服务器凭借其专属IP地址、高安全性和稳定性&#xff0c;在多个关键业务场景中发挥着重要作用。以下是独立IP服务器的主要应用场景&#xff1a;一、大型企业网站与电商平台独立IP服务器是大型企业官网和电商平台的首选方案。对于日均访问量百万级的企业网站&#xff0c;独…

模拟信号基础知识体系梳理:完整学习路径

模拟信号从入门到实战&#xff1a;一条清晰的技术成长路径 你有没有遇到过这样的情况&#xff1f; 传感器输出的电压明明应该稳定在1.65V&#xff0c;可实测却一直在跳动&#xff1b;心电图信号刚放大就自激振荡&#xff0c;像收音机搜台时的“滋滋”声&#xff1b;或者ADC读数…