沿概率分布生成随机数的模块

random-gen的Python项目详细描述


随机发电机

Python application

一种随机数生成器,它将从给定的输入列表和概率分布中随机生成数字。 E、 g

>>fromrandom_genimportRandomGen>>>>r=RandomGen((1,2,3),(0.5,0.1,0.4))# input number list, probability distribution>>generated_numbers=[r.next_num()for_inrange(0,11)]>>>>importcollections>>collections.Counter(generated_numbers)# See distribution of numbers generatedCounter({1:7,2:1,3:3})

如您所见,数字的分布与传递给RandomGen的概率分布大致一致。 这个实现来自cpython随机选择()-https://github.com/python/cpython/blob/master/Lib/random.py#L397 并针对已知累积重量和k进行了优化

这是通过使用随机数列表的累积概率来实现的。随机产生的概率(使用random.random) 乘以概率总和。然后将这个概率插入到累积的列表中 使用bisect.bisect和用于返回相对随机数的插入位置的概率(来自输入random_nums)。 因为概率是沿着概率分布成比例的(因为它乘以 它更有可能返回概率更大的数字。在

先决条件

  • Python 3.6

跑步

^{pr2}$

测试

  • 运行测试:pytest tests/test_random_gen.py

如何让RandomGen更“Python”

我们可以将标准Python Generator类的子类化,并使用dunder方法提供next_num__next__或者简单地提供一个称为random_gen的生成器函数,该函数在调用时生成每个结果。
如果用例少于10000个,我还建议直接使用random.choices,而不是包装在一个类中 输入(否则性能会受到影响)。这将更简单,更易读。在

性能

# input numbers provided# output numbers generatedspeed (secs)function callsmemory consumption for next_num (mb)
1001000.00530411
100010000.002300411
10000100000.0183000412.4
1000001000000.17230000433
10000010000001.953000004199

进一步优化

  • 内存消耗需要调查。有没有其他有效的方法来分割累积概率阵列 不用单子?在
  • 阵列/在需要时为大组数字提供高效存储。在
  • 研究平分的性能。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java ajax请求不允许POST请求   java引用Android应用程序中其他模块的通用模块   JavaSpringBootWebFluxFlatmap是链接http调用的正确方法吗?   java如何在底部工作表中设置折叠工具栏?   任务“:compileJava”的java执行失败。“>无效的源版本:1.7   java Rabbit MQ不刷新ACK?   JavaWebSphere7:METAINF/config/ibmaxis2。无法正确加载xml Axis2全局配置文件   在Java中找出字符串是否包含数组中的值   java Liquibase通过Springboot执行postgres方法   java在Eclipse中安装Maven而不使用插件   Swing应用程序中的java SMTP错误   web应用程序InvalidKeyException:Java中使用RSA密钥的密钥格式无效   java显示JFrame作为JButton单击的结果?   java如何保留Apache Camel Exchange的属性,如果消息是从RabbitMQ生成和使用的   java使用流提取哈希映射列表中的所有对象   Android应用程序中的java单词检查器