抢红包算法经常在面试的时候被问到,那么今天我就给大家分享一个比较常用容易理解的算法,线段分割法的实现。

算法思路:

线段分割法就是把红包总金额想象成一条线段,而每个人抢到的金额,则是这条主线段所拆分出的子线段。

当N个人一起抢红包的时候,就需要确定N-1个切割点。

因此,当N个人一起抢总金额为M的红包时,我们需要做N-1次随机运算,以此确定N-1个切割点。

随机的范围区间是(1, M)。当所有切割点确定以后,子线段的长度也随之确定。这样每个人来抢红包的时候,只需要顺次领取与子线段长度等价的红包金额即可。

需要注意:

1、每个人最低也要抢到1分钱,要保证不能抢到0元的情况;

php代码实现:

$num = 4; //红包个数

$money = 100; //红包钱数100元

$money_fen = $money * 100; //元转换成分

//从1至总金额*100中,随机取4-1个随机数

$i = 1;

$rand = [];

while ($i < $num)

{

//$money_fen需要减1 不然最后一个人可能抢到0元

$rand_num = mt_rand(1,$money_fen-1);

//如果已经存在该随机数不保存,主要解决抢到0元的情况

if(!in_array($rand_num,$rand,true))

{

$rand[] = $rand_num;

$i+=1;

}

}

//从小到大排序

sort($rand);

//中奖结果

$result = [];

foreach ($rand as $key =>$value)

{

if($key == 0)

{

$result[] = $value;

}

else

{

$result[] = $value - $rand[$key - 1];

}

}

//最后一个人的中奖结果

$result[] = $money_fen - $rand[count($rand) - 1];

//转化成元

foreach ($result as $key=>$value)

{

$result[$key] = $value / 100;

}

print_r($result);

java抢红包线段分割法_抢红包算法——线段分割法相关推荐

  1. java中驼峰编码,驼峰式命名法_小驼峰式命名法编程_java中getter和setter

    人们交流靠各种语言,每行都有每行的所谓的"行话".程序员也不例外,众所周知,程序员都是用代码进行交流的.那么除了在代码中的注释之外, 程序员如何读懂别人的程序呢? 当然,程序员之间 ...

  2. 分油问题回朔法c语言算法,用回溯法求“韩信分油”问题所有解

    裴南平 摘要:回溯法是一种常用的计算机程序设计方法.使用回溯法解决"韩信分油问题"也称"泊松分酒问题",在算法中保存每一步执行的中间结果,程序扩展前,判斷程序是 ...

  3. c语言线段树建树程序,C++算法 线段树

    线段树这个算法,看起来非常高端,而且很有用处,所以还是讲一下下吧. 温馨提示:写线段树前请做好写码5分钟,调试一辈子的准备^-^ 啊直接步入正题-- 首先我们考虑一个题目:有一个序列,要做到单点修改单 ...

  4. sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用

    数学专题(一)  隔板法的妙用 浓度常见哪些问题? 排列组合分堆?涂色?到底掌握透彻了吗? 解析几何与韦达定理? 公式总是记不住?应用题还不会解? 除了写作(写作听我的).逻辑(逻辑说)专题外,本周起 ...

  5. java 穷举法求水仙花数_常用算法-穷举法

    穷举法又称为枚举法,它是在计算机算法设计中用得最多的一种编程思想.它的实现方式是:在已知答案范围的情况下,依次地枚举该范围内所有的取值,并对每个取值进行考查,确定是否满足条件.经过循环遍历之后,筛选出 ...

  6. java通过比较大小排序_排序算法的比较与java实现

    冒泡排序 基本思想: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上 ...

  7. java每轮排序结果_【算法队列面试题】面试问题:java选择题… - 看准网

    1.ArrayList类的底层数据结构是(  ) A.数组结构 B.链表结构 C.哈希表结构 D.红黑树结构 2.LinkedList类的特点是(  ) A.查询快 B.增删快 C.元素不重复 D.元 ...

  8. 最大公约数算法_更相减损法_辗转相除法(即欧几里得算法)

    package algorithm;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  9. java零钱换整程序_贪心算法换零钱(java)

    贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解, ...

最新文章

  1. 动画 Interpolator
  2. 【AC Saber】数据结构
  3. SAP Spartacus home 页面的 cx-page-slot selector
  4. 硬件:电脑基础进阶必学知识,详解电脑主板跳线!
  5. 转:VC6.0与VC.net的具体区别
  6. php 标签库,PHP.MVC的模板标签系统之模板标签库
  7. linux查找、搜索字符或文件
  8. 软件开发从需求分析开始
  9. skywalking mysql配置_skywalking 配置和使用(windows)
  10. 远程连接ubuntu的MongoDB遇到的坑
  11. 惊!微信可以转发语音了?!
  12. APP开发接口分类介绍
  13. VS2010使用c++、gSOAP创建WebService 图文教程
  14. 自动驾驶(二十)---------Waymo数据集
  15. 考研复试数据库原理课后习题(七)——数据库设计
  16. Evasion Attack in Adversarial Machine Learning
  17. 超长内容自动显示省略号
  18. 海思SDK学习(11)海思媒体处理软件平台MMP(10)VGS视频图形子系统
  19. LaTex论文排版 | (30) 三线表
  20. 多源异构数据整合在多规合一中的应用

热门文章

  1. PDF怎么转换成长图
  2. Spark2.1.0之初体验
  3. PCL安装和环境配置
  4. 第五章 多变量线性回归
  5. 数据库(day02)
  6. 微信小程序开发工具调试
  7. win10服务器cpu占用过高,完美解决:Win10资源管理器占用CPU过高
  8. Matlab--优化工具箱
  9. 花洒水龙头加州节水认证CEC
  10. 神盾局第二季麦克机器人_神盾局特工第四季分集剧情介绍(1-22集)大结局