热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript:Javascript实现概率抽奖算法及改进方案

最近一次面试被问到一个概率抽奖的问题,记录一下,题目是:实现一个抽奖零碎,抽到一等奖的概率为10%,二等奖的概率为20%,三等奖的概率为30%,四等奖的概率为40%。

最近一次面试被问到一个概率抽奖的问题,记录一下,题目是:实现一个抽奖零碎,抽到一等奖的概率为10%,二等奖的概率为20%,三等奖的概率为30%,四等奖的概率为40%

写进去之后,又让我写一个测试代码,跑1000次,看后果概率是否靠近。

作为前端入门的代码萌新,遇到这种问题,只能临场发挥,素来没写过后盾的逻辑~

let _prize = ['A','B','C','D'] //奖项
let _prop = [1, 2, 3, 4] //权重
let a = 0, b = 0, c = 0, d = 0; //统计抽到每个奖的次数 
let count = 0; //统计测试次数
 
//依据奖项和权重生成奖池(如果奖项少,概率简略,能够不必这一步,间接手写奖池)
let generatePool = (prize, prop) => {
    let pool = [];
    for (let i = 0; i  {
    let random = Math.floor(Math.random() * poolLen) //奖池容量里的一个随机数
    switch (newPool[random]){ 
        case 'A':
            a++
            break
        case 'B':
            b++
            break
        case 'C':
            c++
            break
        case 'D':
            d++
            break
    }
    count++; //统计测试次数
}
 
 
 
//反复测试n次,并计算概率
let computeP = (func, times) => {
    while (count  {
        res[k] = (item/100/poolLen).toFixed(2)
    })
    return res
}
 
//测试1000次
console.log(computeP(getPrize, 1000))
 
//上面是跑进去的几次后果,还是比较稳定的
//> ["0.10","0.20","0.32","0.38"]
//> ["0.09","0.20","0.29","0.41"]
//> ["0.08","0.20","0.29","0.42"]
//> ["0.10","0.18","0.30","0.42"]

写下来发现,本人写的还是太菜,曾经尽力去形象,然而很多函数还是不能拿来复用,每次须要改一些数据才行,然而后果来讲是好的

10/17/2021 更新

依据其他人的博客(忘了在哪看的了)发现了一个更高效的算法,利用离散化和二分查找来实现

假如需抽到ABCDE的概率为1%,3%,6%,30%,60%

为了防止像之前一样生成一个大数组Pool,咱们间接取边界值来讨论会更不便。从1-100的正整数中随机取一个数,取到1就是奖A,取到2、3、4就是奖B,依此类推,咱们只须要判断生成的随机数在哪一个区间即可。

这里咱们能够按程序从小到大查找这个随机数,也能够二分查找。这里用二分能够升高工夫复杂度到logN,通过判断区间,输入一个奖项,而后反复执行计算概率


let _prize = ['A','B','C','D','E']
let _prop = [1, 4, 10, 40, 100] //累计散布函数
let a = 0, b = 0, c = 0, d = 0, e = 0;
let count = 0;
 
let getPrize = () => {
    let random = Math.ceil(Math.random() * 100) //生成1-100的正整数
    //二分查找
    let low = 0
    let high = _prop.length - 1
    count++;
    while (low  _prop[mid] && random <= _prop[mid + 1]){
            return _prize[mid + 1]
        } else if (random > _prop[mid + 1]){
            low = mid 
        } else {
            high = mid 
        }
    }
    return _prize[0]
}
 
let computeP = (func, times) => {
    while (count  {
        res[k] = (item/times).toFixed(3)
    })
    return res
}
console.log(computeP(getPrize, 1000))
 
//> ["0.012","0.033","0.056","0.300","0.599"]
//> ["0.015","0.026","0.045","0.308","0.606"]

推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 本文介绍了如何使用OpenXML按页码访问文档内容,以及在处理分页符和XML元素时的一些挑战。同时,还讨论了基于页面的引用框架的局限性和超越基于页面的引用框架的方法。最后,给出了一个使用C#的示例代码来按页码访问OpenXML内容的方法。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了如何对PHP二维数组进行排序以及如何获取最大值。同时还提到了在数据分析系统中使用排序的实例,以及如何统计角色等级和创建角色总数。 ... [详细]
  • PHP中的curl_multi系列函数可以实现同时请求多个URL来实现并发,而不是像普通curl函数那样请求后会阻塞,直到结果返回才进行下一个请求。因此在批量请求URL时可通过curl_multi系列函数提升程序的运行效率。curl普通请求$startT ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了htmlJS相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
mobiledu2502913165
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有