当前位置: 首页 > news >正文

random.sample() 函数原理

random.sample() 函数在 Python 中是基于 Fisher-Yates(或 Knuth)洗牌算法的一个变种实现的。这个算法可以高效地随机打乱一个序列,而 random.sample() 则利用这个算法来从序列中随机选择不重复的元素。以下是 random.sample() 的基本实现原理:

原理步骤:

  1. 初始化:
    • 确定总体的长度 n 和需要采样的数量 k
    • 创建一个空列表 sample 用于存放选中的样本。
  2. 选择第一个样本:
    • 0n-1 的范围内随机选择一个索引 i
    • population[i] 添加到 sample 列表中。
    • 为了确保不会再次选择到这个元素,将 population[n-1]population[i] 交换位置,并将 n 减去 1
  3. 选择后续样本:
    • 对于后续的每个样本,从 0n-2 的范围内随机选择一个索引(因为 n 每次都在减少)。
    • population[i] 添加到 sample 列表中。
    • population[n-2]population[i] 交换位置,并将 n 减去 1
  4. 重复步骤:
    • 重复步骤 3,直到 sample 列表中有 k 个元素。
  5. 完成:
    • sample 列表中有 k 个元素时,停止抽样。
      以下是这个算法的伪代码:
def random_sample(population, k):n = len(population)sample = []for i in range(k):# 从当前未选择的元素中随机选择一个j = random integer from 0 to n-1# 将选择的元素添加到样本列表sample.append(population[j])# 将选择的元素与未选择元素中的最后一个交换位置population[j], population[n-1] = population[n-1], population[j]# 减少未选择的元素数量n -= 1return sample

在 Python 的 random 模块中,random.sample() 函数的实现更加高效和优化,但基本原理是相同的。这个算法确保了每个元素都有相同的被选中的概率,并且每个元素最多被选中一次,从而实现了无放回的随机抽样。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RT-DETR:DETRs Beat YOLOs on Real-time Object Detection (CVPR2024)
  • M3U8流视频数据爬虫
  • 达梦数据库的系统视图v$bufferpool
  • 学习测试12-车(略)
  • Windows下Git Bash乱码问题解决
  • C++11新增特性及右值引用
  • C#高级:枚举(Enum)从索引、值到注释的完整使用技巧
  • 养猫老手激情开麦!希喂白小罐试吃测评分享!
  • Leetcode 11. 盛最多水的容器
  • 【Django5】模型定义与使用
  • 小程序、H5、APP中的微信支付概述和实战总结
  • 【机器学习】Jupyter Notebook如何使用之基本步骤和进阶操作
  • Kafka、RabbitMQ、RocketMQ:消息队列技术深度对比
  • C++:map和set
  • 实验4-2-2 使用函数求e的近似值
  • [译]前端离线指南(上)
  • Angular2开发踩坑系列-生产环境编译
  • Asm.js的简单介绍
  • PAT A1120
  • php中curl和soap方式请求服务超时问题
  • React-redux的原理以及使用
  • SQLServer之索引简介
  • Vue实战(四)登录/注册页的实现
  • Webpack 4x 之路 ( 四 )
  • web标准化(下)
  • Zepto.js源码学习之二
  • 从tcpdump抓包看TCP/IP协议
  • 订阅Forge Viewer所有的事件
  • 嵌入式文件系统
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 一起参Ember.js讨论、问答社区。
  • HanLP分词命名实体提取详解
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 从如何停掉 Promise 链说起
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # centos7下FFmpeg环境部署记录
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 数论-逆元
  • #### golang中【堆】的使用及底层 ####
  • (09)Hive——CTE 公共表达式
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (算法)N皇后问题
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *Django中的Ajax 纯js的书写样式1
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework 4.6.2改进了WPF和安全性