将链表储存的单位随机取出一半
最近有个需求,其中一个主要的要求是假设一个建筑物中有20个农民在进行修缮工作,我想要从这个建筑物到另一个建筑物进行一次拖拽操作。该拖拽操作将会将其中一半的农民(向下取整,保证最少有一个农民)取出成一个农民小队,他们将前往另一个建筑物准备新的修缮工作。其中每个农民单位并不完全一样,比如里面可能有强壮类型的农民,灵活类型的农民或速度类型的农民,也就是说每个农民要视为单个的个体,不能直接按数量取出。
大致看上去,想法就是直接在储存空间中进行取半数的循环,每次随机进行存储农民的类型,然后返回一个储存农民类型的List
但是存放农民信息的储存空间是链式结构,不能直接按索引取。那么最好的办法则是使用蓄水池算法
比如20个农民我们要取其中的10个农民,那么就先将前10个农民放进我们要返回的List中,而对第11个农民以10/11的概率选取他来替换已选中List的随机一个农民。
而该第11个农民被第12个农民替换后仍然保留的概率是 [第十二农民没被替换的概率]加上[第十二个农民替换但没选中第十一个农民的概率],总计为[2/12]加上[10/12 * 9/10],为11/12
那么以此可以判断第11个农民被第13个农民替换后仍然保留的概率为12/13,累乘后的式子则是10/11 * 11/12 * ... * 19/20,最后可以得出该农民被保留的概率为1/2,以此就能保证每个农民被选中的概率都是均等的。
最后返回这个List就完成了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具