iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python的random模块及加权随机算法的python实现方法
  • 525
分享到

python的random模块及加权随机算法的python实现方法

算法模块方法 2022-06-04 18:06:28 525人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。 •random.seed(x)改变随机数生成器的种子seed。 一般不必特别去设定seed,python会自动选择se

random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串

•random.seed(x)改变随机数生成器的种子seed。

一般不必特别去设定seed,python会自动选择seed。

•random.random() 用于生成一个随机浮点数n,0 <= n < 1

•random.unifORM(a,b) 用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b;

•random.randint(a,b) 用于生成一个指定范围内的整数,a为下限,b为上限,生成的随机整数a<=n<=b;若a=b,则n=a;若a>b,报错

•random.randrange([start], stop [,step]) 从指定范围[start,stop)内,按指定基数递增的集合中获取一个随机数,基数缺省值为1

•random.choice(sequence) 从序列中获取一个随机元素,参数sequence表示一个有序类型,并不是一种特定类型,泛指list,tuple,字符串等

•random.shuffle(x[,random]) 用于将一个列表中的元素打乱 (洗牌),会改变原始列表

•random.sample(sequence,k) 从指定序列中随机获取k个元素作为一个片段返回,不会改变原有序列

那么现在基础知识有了,我们来实现一个加权随机算法

加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项。这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%。一般来说,我们可以给各项附一个权重,抽取的概率正比于这个权重。那么上述集合就成了:

{A:5,B:2,C:2,D:1}

方法一:

最简单的方法可以这样:

把序列按权重值扩展成:lists=[A,A,A,A,A,B,B,C,C,D],然后random.choice(lists)随机选一个就行。虽然这样选取的时间复杂度是O(1),但是数据量一大,空间消耗就太大了。


# coding:utf-8
import random


def weight_choice(list, weight):
  """
  :param list: 待选取序列
  :param weight: list对应的权重序列
  :return:选取的值
  """
  new_list = []
  for i, val in enumerate(list):
    new_list.extend(val * weight[i])
  return random.choice(new_list)


if __name__ == "__main__":
  print(weight_choice(['A', 'B', 'C', 'D'], [5, 2, 2, 1]))

方法二:

比较常用的方法是这样:

计算权重总和sum,然后在1到sum之间随机选择一个数R,之后遍历整个集合,统计遍历的项的权重之和,如果大于等于R,就停止遍历,选择遇到的项。

还是以上面的集合为例,sum等于10,如果随机到1-5,则会在遍历第一个数字的时候就退出遍历。符合所选取的概率。

选取的时候要遍历集合,它的时间复杂度是O(n)。


# coding:utf-8
import random

list = ['A', 'B', 'C', 'D']


def weight_choice(weight):
  """
  :param weight: list对应的权重序列
  :return:选取的值在原列表里的索引
  """
  t = random.randint(0, sum(weight) - 1)
  for i, val in enumerate(weight):
    t -= val
    if t < 0:
      return i


if __name__ == "__main__":
  print(list[weight_choice([5, 2, 2, 1])])

方法三:

可以先对原始序列按照权重排序。这样遍历的时候,概率高的项可以很快遇到,减少遍历的项。(因为rnd递减的速度最快(先减去最大的数))

比较{A:5,B:2,C:2,D:1}和{B:2,C:2,A:5,D:1}

前者遍历步数的期望是5/10*1+2/10*2+2/10*3+1/10*4=19/10而后者是2/10*1+2/10*2+5/10*3+1/10*4=25/10。

这样提高了平均选取速度,但是原序列排序也需要时间。

先搞一个权重值的前缀和序列,然后在生成一个随机数t后,可以用二分法来从这个前缀和序列里找,那么选取的时间复杂度就是O(logn)了。


# coding:utf-8
import random
import bisect

list = ['A', 'B', 'C', 'D']


def weight_choice(weight):
  """
  :param weight: list对应的权重序列
  :return:选取的值在原列表里的索引
  """
  weight_sum = []
  sum = 0
  for a in weight:
    sum += a
    weight_sum.append(sum)
  t = random.randint(0, sum - 1)
  return bisect.bisect_right(weight_sum, t)


if __name__ == "__main__":
  print(list[weight_choice([5, 2, 2, 1])])

以上这篇Python的random模块及加权随机算法的python实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: python的random模块及加权随机算法的python实现方法

本文链接: https://www.lsjlt.com/news/13859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python+random模块实现随机抽样
    目录1. 设置随机数种子 seed()2. random() 与 randint()3. sample()方法 无放回抽样4. choice() 与 choices() 有放回抽样5...
    99+
    2024-04-02
  • 随机森林算法(Random Forest)原理分析及Python实现
    目录 一、基础概念1.监督式机器学习2. 回归和分类3. 决策树4. 随机森林 二、Random Forest 的构造1. 算法实现2.数据的随机选取3. 待选特征的随机选取 三、Ra...
    99+
    2023-09-27
    python 算法 随机森林
  • Python NumPy随机抽模块介绍及方法
    目录1. 随机数2. 随机抽样3. 正态分布4. 伪随机数的深度思考1. 随机数 np.random.random()是最常用的随机数生成函数,该函数生成的随机数随机均匀分布于[0,...
    99+
    2024-04-02
  • 怎么用python中的random模块求随机数
    这篇文章主要介绍“怎么用python中的random模块求随机数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用python中的random模块求随机数”文章能帮助大家解决问题。说明random...
    99+
    2023-06-30
  • python使用Random随机生成列表的方法实例
    目录引言:1.在python中用random生成一个列表。2.翻了一些资料找到了取值不重复的写法3.下面用冒泡排序来实验一下效果附:一行代码实现生成一个随机列表总结引言: 闲来想到冒...
    99+
    2024-04-02
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | 马特赛特旋转算法 | LCG 线性同余算法 | Python Random 模块
         猛戳订阅! 👉 《一起玩蛇》🐍 💭 写在前面:本篇博客将介绍经典的伪随机数生成算法,我们将  重点讲解 LCG(线性同余发生器) 算法与马特赛特旋转算法,在此基础上顺带介绍 Pyt...
    99+
    2023-08-31
    python 蒙特卡洛算法 马特赛特旋转算法 LCG算法 伪随机数发生器
  • python怎么实现随机森林算法
    要实现随机森林算法,你可以使用scikit-learn库中的RandomForestClassifier类。下面是一个示例代码:``...
    99+
    2023-08-15
    python
  • python随机森林算法怎么实现
    要实现随机森林算法,可以使用sklearn库中的RandomForestClassifier类。下面是一个简单的例子:```pyth...
    99+
    2023-10-10
    python
  • python操作jira添加模块的方法
    目录JIRA介绍:python操作jira首先安装jira模块导入jira模块编写添加模块代码获取当前项目的模块信息从excel表读取信息主方法中调用添加模块等方法JIRA介绍: &...
    99+
    2024-04-02
  • 常用的python模块及安装方法
    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数...
    99+
    2023-01-31
    模块 常用 方法
  • Python实现创建模块的方法详解
    目录楔子__import__importlib.machinery通过 module 类创建模块将一个类的实例变成一个模块小结楔子 导入一个模块,我们一般都会使用 import 关键...
    99+
    2024-04-02
  • python中动态加载模块和类方法实现
    python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量。   #coding=UTF-8 class TestClass: def sub(se...
    99+
    2023-01-31
    模块 加载 方法
  • python实现H2O中的随机森林算法介绍及其项目实战
    随机森林(Random Forest)是一种集成学习方法,通过组合多个决策树来进行分类和回归。它在H2O中也有相应的实现。H2O是一...
    99+
    2023-08-15
    python
  • python添加模块路径的三种方法
    之前对mac os系统自带的python进行了升级,结果发现新安装的python的site-packages目录并没有加到python的系统路径中,所以在使用其他库时发现出现了缺少模块的错误。查看python的模块路径方法是import ...
    99+
    2023-01-31
    三种 路径 模块
  • python 动态导入模块实现模块热更新的方法
    最近有个部署需求,需要读取py文件格式的配置项,我的实现思路是把配置文件解析到内存中。主要使用两种方法: importlib.import_moduletypes.ModuleTyp...
    99+
    2024-04-02
  • Python如何实现孤立随机森林算法
    这篇文章主要介绍Python如何实现孤立随机森林算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 简介孤立森林(isolation Forest)是一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划...
    99+
    2023-06-29
  • python模块安装的方法
    这篇文章主要介绍了python模块安装的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python模块安装的方法文章都会有所收获,下面我们一起来看看吧。本文教程操作环境:windows7系统、Python ...
    99+
    2023-06-30
  • Python的加密模块之hashlib与base64详解及常用加密方法
    目录hashlib 模块hashlib 模块中的常用加密方法hashlib模块情景练习base64 模块base64 模块的情景练习我们来学习一下 Python 中的加密模块,加密模...
    99+
    2023-02-24
    Python hashlib base64 Python hashlib base64加密
  • Python导入模块的方法
    Python导入模块的方法有两种:import module 和 from module import a,区别是前者所有导入的东西使用时需加上模块名的限定(module.a),而后者不需要。 导入一个模块,Python 解析器对模块位置...
    99+
    2023-01-30
    模块 方法 Python
  • python下载模块的方法
    本篇内容介绍了“python下载模块的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、模块的下载Python模块(第三方库): htt...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作