有个软件要推广10个人才能有哪些免费用,死粉也行,还差2两个谁能注册下,一个3元红包

微信小游戏《跳一跳》,有什么秘籍?续跳跃到中心可以获得2分的累加,以2、4、6、8
由网友 游戏电台游戏达人 提供的观点:
近期微信更新之后上线了一个小程序游戏【跳一跳】,也在短期内火爆了整个朋友圈,但是一看排行榜,有的朋友玩了几百分,甚至有人跳了上千分,但是自己却怎么玩都还在几十分阶段徘徊。
那么,他们怎么做到的呢?下面台长给大家分享5个关于【跳一跳】小游戏的得分技巧,学会之后,上百分是一件轻轻松松的事情。
1、得分规则
每跳跃一个方块获得1分,特殊方块额外加分,跳出方块外,恭喜你获得重新开始的机会。
2、连续跳跃到方块中心
起跳开始,跳跃到下一个方块的中心可以获得2分,连续跳跃到中心可以获得2分的累加,以2、4、6、8、10&&递增。
3、特殊方块:下水道井盖
跳跃到井盖上之后,不要着急跳到下一块,停留2秒左右,可以获得5分的额外加分。
(小彩蛋:下水道中传来流水声)
4、特殊方块:魔方
同样的,在魔方上停留2s左右,可以获得一个10分的额外加分。
(小彩蛋:魔方纵向第二层旋转一次)
5、特殊方块:徐记士多
在该方块上停留2s左右,可以获得15分的额外加分。
(小彩蛋:店门打开,想起一个叮铃声)
6、特殊方块:音乐播放器
在改方块上停留2s左右,能够获得30分的高额加分。
(小彩蛋:音乐想起,播放器上会有音符出现?)
7、小技巧:手指测距
通过多次尝试,用手指压着屏幕在间隙中滑动,并找到这个速度,保持这个速度压住屏幕滑动,等于在测距的同时,也计算好了压屏幕时间,保持这个速度和节奏几乎可以一直玩下去。
8、小技巧:听声
玩游戏的时候打开游戏声音,每次压下去的时候都会有一个相同节奏的音乐,把握好这个节奏,并跟上音乐的步调也可以很准确的跳下去。
只要把握好节奏,注意一些小节奏,虽然不一定都是上千分这样的大神,但是上百分还是非常容易的。大家朋友圈里【跳一跳】的最高分都是多少呢?
最后记得关注一波台长,一个有趣、有用、有态度的游戏自媒体。
本文由头条问答签约作者【游戏电台】所著,未经允许,禁止擅自转载。
由网友 A男人霸气十足 提供的观点:
要说秘籍,还是有的,因为我亲身经历过,用我的亲身经历与大家一起分享,
玩跳一跳也没有多长时间,也就半个月吧,刚开始总是跳几分,或者十几分就结束了
经过一次次尝试,也能摸索出一些规律,
跳到中心能加2分,连续跳到中心能倍增,
跳到井盖,停留两秒,有冲水的声音,加5分
跳到魔方,停留2秒,魔方修正加10分
跳到商店,停留2秒,商店开门,加 15分
跳到音乐盒上,停留2秒,美妙的音乐??旋律加30分
以上说的这些只不过是最基本的,光靠这些,不会跳出488分的好成绩,也不会身居第二名,
大家玩过跳一跳的都知道,触摸屏幕的时候是有间断的声音的,方块与方块之间的距离,与触摸屏的声音成正比,它的节凑准确率是靠个人内心衡量的,准是重重之重,其实跳一跳小游戏在我的微信朋友圈里,大多数都是年轻人玩的,像我这年龄玩跳一跳的真不多,我这人对新生事物好奇,凡事都想尝试,尝试之后不留遗憾,废话不说了,望大家都有好成绩,也耽误了大家的宝贵时间,望谅解!
由网友 萌萌哒初音公主 提供的观点:
现在,微信上有一个很火的小程序游戏,名叫《跳一跳》
排行榜上有些人前三名的都在几千分左右,可是最后几名十多分也达不到。初来乍到的小白级玩家可能盯着几千分眼馋,也可能不知道秘籍,误以跳上每个格最多只能得1分。
今天给大家分享几个小秘籍,虽然我的分数也不到200,但是不过还是非常有用的??
秘籍一 特殊方块加分
先介绍一下加分最高的方块哈,这种方块不是一般的方块,它是加分方块中的一种,并且加分最高,可加30分,名叫留声机。要听声音,它在给你加分时会先响起Merry Christmas音乐。
在这些特殊方块上面获得外加分数非常简单,只要你跳上了这个特殊方块,在上面稍微停一会,大概两三秒左右就会自动给你加分。
这是下水道,它也可以加分。它加分时也是主要听声音,你听见哗啦哗啦的流水声的时候就可以给你+5分
还有两种特殊加分方块是魔方和报社,分别加分10分和15分,就不多说了。
秘籍二 中心点加分
这个秘籍就是:第一次跳在方块中心+2分第二次跳到中心加4分,第三次加6分,第四次加八分。以此类推。
最后给大家推荐一个考验你协调能力的小游戏,叫Mr jump,这个小游戏有点类似超级玛丽,非常考验你的手眼脑协调能力,保证可以让你在跳一跳小游戏的排名往上排。
由网友 提普斯 提供的观点:
最近两天 ,随着微信新版本的更新,朋友圈掀起了跳一跳的风潮,相信很多朋友都已经入坑。
看到那些排行榜上动辄200,300分的好友,再看看自己埋头数个小时,点破手指却没点长进的成绩,是不是很苦恼呢。
今天提普斯就位大家整理一些tips,帮助各位朋友尽快冲上好友排行榜,200,300分也不在话下
请点击此处输入图片描述
中点连跳得分加倍
请点击此处输入图片描述
这个可能大家在游戏过程中都有注意到,不过这里要强调的是,连续落到中点,加成是翻倍的。这个tips需要玩家具备一定的技术水准,小编最多也就连过5次。
特殊垫脚石有隐藏分数加成
当落到一些特殊的形状的垫脚石时候,先不要着急继续往下跳,停留一会会有惊喜加成
等到井盖出现抽水声音
魔方 +10分
等魔方自动拼好
便利店 + 15分
等到便利店开门
影碟机 + 30分
等到影碟机开始播放歌曲
提普斯 分享生活中的一些tips,以及一些生活感悟,希望大家喜欢。喜欢的话,请关注哦
由网友 有一生活 提供的观点:
在这跟大家分享一下,我玩跳一跳的经验,希望对你拿高分会有帮助吧!
1、连续跳到中心点,可以加2分,4分,6分,8分,10分...一直累计啊,前提是你要跳的够准!
2、跳到井盖盒子上停留可以额外加5分!
3、跳到魔方盒子上停留可以额外加10分!
4、跳到徐记士多盒子上停留可以额外加15分!
5、跳到音乐盒上停留和加30分!
不知道你们拿高分的方法是不是和我一样的啊?
由网友 中易商学 提供的观点:
近期微信更新上线了一个小程序游戏《跳一跳》,它在短期内火爆了整个朋友圈,但是一看排行榜,有的朋友玩了几百分,甚至有人跳了上千分。那么,他们怎么做到的呢?
下面给大家分享一个据说只有业内人士才知道的秘密:
这些得分方式,你知道几个?
由网友 琴断心封 提供的观点:
最近微信小程序里的两款小游戏是异常火爆,一个是头脑王者还有一个是跳一跳。若说玩的人多的非跳一跳莫属。跳一跳为什么能刷爆朋友圈呢?只源于这个加分机制,玩的时候感觉是你自己在玩,通关之后你就会看到比你分数低的有,比你分数高的也大有人在。那有什么加分秘籍吗?
小编这几天一有时间就玩两把,心里总是想着玩完这把就不玩了,可是手就是停不下来啊!小编朋友圈人不多,过千分的还真没有,几百的倒是大有人在。小编玩了几次一百多分,若说加分秘籍也说不上,小技巧倒是有点。
第一点就是连跳加分,连续跳到盒子的中心点,第一个二分,第二个四分,第三个六分......这就要靠我们的手感是视距。
第二点就是跳在有特殊标志的盒子停留两秒会有不同的加分,井盖5分,魔方10分,便利店15分,魔方30分。
第三点就是要调整好节奏,虽然两个盒子之间的距离每次都差不多,但是跳的远近跟在盒子上停留的时间和起跳速度有很大关系。比如说在连续跳跃时,速度快跳跃的距离就比较近。但是你如果在一个盒子上停留的时间长,跳跃的节奏打破了,长按时间长跳跃的距离就远。
所以说技巧是长时间摸索出来的,就是要经常联系找好手感,才能跳出高分。
由网友 学渣生活录 提供的观点:
除了耐克广告箱你还知道哪些新秘籍?进入3月份以来,微信的跳一跳相对于以前的版本又作了更新和改变。现在先来回顾一下之前的高分秘籍有哪些?为了便于大家记忆,我都将其进行了拟人化称呼。
NO1.淡定圈心哥。简单点,就是直接跳到圈心就可以了,如果每次都可以跳到正中心,会以2.4.6.8等的方式叠加。
NO3.暖心超市一姐。
NO4.大胖子井盖叔。
跳到以上福利后,都需要你在上面停顿大概3秒钟左右才会产生效果。
接下来重点讲讲新版本的福利。直接看图
还有一个,我刚刚玩了好几把都没碰到过,耐克的广告箱子。
遇到这些场景都能够让你迅速加分!
由网友 His3207778 提供的观点:
近日微信小游戏跳一跳特别火爆,可以说是老少皆爱的一款小游戏,
相信在朋友圈当中有的几百上千,为什么自己的怎么也跳不好,下边我为大家分享一下自己的小秘籍,让你在朋友圈当中顺间跳出好成绩。
1.跳到音乐盒上停一秒,音乐响起,加30分
2.跳到徐记士便利店停一下,门开,加15分
3跳到魔方停一秒,魔方旋转,加10分
4.跳到井盖上,停留一秒,听见流水声,加5分
小伙伴们赶紧行动起来吧!胜利?是属于你的!
由网友 偎依宝贝育儿问答达人 提供的观点:
跳一跳游戏这些天可是人声鼎沸,热闹非凡,要说可靠秘籍的话如下:
1.熟能生巧,多玩几次,你就可以掌握力度以及技巧,建议玩的时候打开游戏声音,通过声音判断蓄力情况,由此来确保每次都能跳中目标。
2.跳到盒子中间的话,会得到 2 分,一直在盒子中间会在上次的基础再加 2 分,以此类推。
3.在特定的盒子上停留会有额外的加分哦,比如黑胶唱片机停留会播放音乐加 30 分、魔方停留加 10 分、污水井盖加 5 分、徐记士多加 15 分,
可能大家还听说有黑科技,但建议大家不要用。只要掌握上面技巧的话,四五百分是没问题,不要用了黑科技账号被封,就得不偿失了。
再者,玩游戏属于娱乐,通过一些的不劳而获的手段获取的荣誉,对于个人来说,失去原本玩的乐趣。
由网友 杨? 提供的观点:
微信跳一跳,不适应外挂的秘籍,
第一、玩游戏心要静,不能有什么烦心事。
第二、不要在左上角的分数,可以有意遮盖。
第三、仔细听声音和节奏,保正自己跳的距离。
第四、污水井盖稍作停留就可以一下加5分。
第五、跳到魔方上,稍作停留可以加10分。
第六、跳到便利店上,稍作停留,可以加15分。
第七、跳到音乐盒上,稍作停留,可以加30分。
第八、要有耐心,失败了,缓口气,再来再来。
稳准狠,加油。我也跳不过那些微信还有,刚三百来份,这个礼拜就跳了两次而已。
原标题:微信小游戏《跳一跳》,有什么秘籍?
Game234游戏门户网声明:Game234游戏门户网登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。部分图片及内容来自互联网,版权归原作者(原网站)所有,转载时请务必注明来源,若有侵权问题请及时与本站联系 。
相关资讯:
&微信最烧脑大挑战1-20微信最烧脑大挑战全部答案微信最烧脑大挑战答案汇总,最烧脑大挑战是微信中的一款小游戏,游戏中会设有许多有趣的关卡,不知道大家都玩到哪一关了呢,小编带来了微信最烧脑大...
欢乐球球是微信上很火的一款小游戏,这其实就是一个小球向下走的游戏,要保持自己的小球不挂掉,按键是非常重要的,很多小伙伴还不知道乐球球怎么按键,那么快一起来看看下面的方法介绍吧!微信欢乐球球怎么按键?控...
微信欢乐球球是很受欢迎的一款小游戏,在游戏中玩家可以获得复活的机会,那么微信欢乐球球无限复活怎么得,最多可以复活几次呢,快快和小编一起来看看下面的介绍吧!微信欢乐球球无限复活怎么得?第一次死亡后,可以...
最近,微信上出了好多好玩的小游戏,其中欢乐球球就是大家都在玩的一款小游戏,这款小游戏想玩得高分是需要一定技巧的,快快随小编一起来看看关于欢乐球球高分攻略吧!微信欢乐球球全关卡高分技巧这是一款向下走小球...
欢乐球球是微信上的一款休闲益智小游戏,简单的玩法使玩家很容易上手,不过有蛮多玩家反映,游戏中会有欢乐球球控制不了的情况,那么快随小编一起来看看是怎么回事吧!微信欢乐球球控制不了怎么回事?1.玩家的手机...
微信欢乐球球是一款好玩的小游戏,微信用户在小程序中搜索欢乐球球即可进入游戏,很多新手玩家还不知道欢乐球球怎么玩,那么快快一起来看看下面的玩法攻略吧!微信欢乐球球玩法攻略1.打开我们的微信,然后找到&l...
[闽南网]我的前世青年照最近火爆朋友圈,很多玩家都在问,这照片在哪拍,下面小编就为大家带来我的前世青年照制作入口,赶快来看看吧!我的前世青年照在哪拍下载天天P图这个软件,里面有个前世青年这个宣传界面,...
&海盗来了微信海盗来了是一款很好玩的休闲小游戏,不少小伙伴都有在玩,其中能量和金币是每个玩家必需的资源,下面小编就为大家带来微信海盗来了相关玩法攻略,一起来看看哦!&微信海盗来了怎...
最近又有一款新的小游戏刷爆朋友圈,这款游戏叫&最强弹一弹&,那微信最强弹一弹有什么技巧?怎么样才能够取得高分呢?今天,小编为大家带来微信最强弹一弹技巧玩法攻略,一起来看看吧。延...
微信六六六消除看似简单易操作,但其实要玩得高分是需要技巧的,那么微信六六六消除怎么玩高分?一起来看看六六六消除玩高分攻略!微信六六六消除怎么玩高分?控制按键:用手指触动屏幕把下面的形状放到上面的六边形...
最强弹一弹这款小游戏在微信中早已接替火极一时的跳一跳。微信最强弹一弹游戏规则有哪些,最强弹一弹游戏怎么玩,近期好多小伙伴都在玩微信最强弹一弹,更多玩家都不知道最强弹一弹游戏规则,小编这就为大家分享下微...
微信弹球王者是一款好玩的小游戏,有不少的玩家都在弹球王者玩得了高分,那么微信弹球王者怎么刷高分呢,快和小编一起来看看下面的攻略吧!微信弹球王者怎么玩高分?如果想要刷分的话唯一的办法就是通过游戏的辅助,...
弹球王者是微信上好玩的一款小游戏,很多小伙伴在玩这款游戏的时候,会出现总是容易卡住的情况,那么弹球王者卡住了怎么办呢,快快一起来看看下面的方法介绍吧!微信弹球王者怎么老是卡住?【原因】前期是因为游戏本...
不知道你有没有感受到,这几天各大微信群里频繁出现的已经不再是抢红包、宣传游戏产品,而是各种小游戏的分享:&你可以弹珠10000下吗?&&小哥哥小姐姐玩到停不下来!&...
微信海盗来了无限能量怎么弄?微信海盗来了无限能量方法一览。下面跟着小编一起来看看吧!这游戏说简单也简单,能量是其中的核心,那么新手玩这游戏很可能就是一顿乱点,不会去计算能量从哪里来,下面就来为大家介...
最近微信小程序游戏突然爆火,各种“分享到群复活”把上古时期的僵尸群都给炸了出来。这些小游戏通过这种病毒式传播,迅速在微信庞大的用户基础中扩散开来。然而这些依托于小程序,被业界寄予厚望的”颠覆传统”的游...
&自然增长与每日无限能量许多的玩家都非常想要搞清楚微信海盗来了无限能量怎么弄,毕竟这个对咱们来说的确很是重要,有了无限能量肯定很厉害了呀,因此下面就来为各位介绍一下微信海盗来了无限能量方法攻...
&怎么刷能量许多的玩家都非常关心微信海盗来了怎么刷能量,毕竟这个对咱们的帮助的确很大,因此下面就来为各位讲解一下海盗来了能量怎么快速刷出来,搞清楚了后就能够发现海盗来了怎么送好友能量啦。【微...
&转盘技巧规律许多的玩家都很是关心微信海盗来了转盘技巧规律攻略,毕竟这个对咱们的帮助的确挺大的,因此下面就来为各位讲解一下微信海盗来了转盘抽奖技巧攻略,希望能够很好的帮到各位哟。在微信小游戏...
&能量许多的玩家都对海盗来了这款游戏新手该怎么玩很是好奇,毕竟这个微信海盗来了的玩法攻略技巧着实很是令不少的玩家非常想要搞清楚是怎么回事,因此下面就来为各位讲解一番,希望能够帮到各位。微信海...
文章评论:
5380人浏览
1991人浏览
1444人浏览
7 03到现在刚刚更新一天,相信不少水友们已经在鱼塘里牛刀小试了,对于新版本的改动,大家怎么看呢?下面就和小编一起来看看zhou神是怎么理解的吧。
在今天的比赛中,Rookie带病上场,带领iG成功翻盘,在第二局比赛中,他用劫拿下了10 1 8的完美数据。这是他本赛季第7次击杀上双(超过10),这一数据遥遥领先LPL其他选手。排名第二的是Condi、GimGoon、Scout,各有两次击杀上双。
北京时间3月18日,LPL2017春季赛第6周第三天的比赛日。这一天将会有三场对决在正大广场上上演,而在第三场EDG对SS的比赛中,厂长或将重回LPL舞台。教你微商引流吸粉加客户的100种方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
教你微商引流吸粉加客户的100种方法
&&教你微商引流吸粉加客户的100种方法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩11页未读,
定制HR最喜欢的简历
你可能喜欢更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
绝不吃鸡08期:谁先死谁发100元红包,比吃鸡还刺激
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
绝不吃鸡08期:谁先死谁发100元红包,比吃鸡还刺激">绝不吃鸡08期:谁先死谁发100元红包,比吃鸡还刺激
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制以前想过一个类似问题,就是没有每个人最大、最小的得钱数的限制,以前的问题可以很好用随机数解决。
于是这个问题也被以前的思想带坑里了,把突破口完全放在了如何处理每个人的随机数上。
于是在面试时间就没有解决这个问题,直到面试结束自己安静下来,仔细想想,发现思路错了。
我认为正确的思路是:每个人先得6块钱,这样剩下40块钱,之后每次拿出一块钱,随机分配给一个人,如果某个人的钱数达到了上限,那么这个人下次就没有了再得到钱的资格了。这样直到剩下钱都分配完。
当然在接口的实际处理上可以做些优化,例如剩下的钱每次随机分配的钱可以是随机的(当然这个随机要做一些限制,以免一下就分配超额了),然后如果某个人钱+这次随机分配的钱&每个人的上限,那么他就没有资格得到这个钱了。
随机分配也好实现,先算有几个人有资格得到这笔钱,随即一个数,决定给第几个符合资格的人。
我的思路就是这样,大家如果有更好的思路,请告知。谢谢。
$cash = 40;
$user_arr = array(6,6,6,6,6,6,6,6,6,6);
while($cash&0){
$user_id = rand(0, 9);
if($user_arr[$user_id]&12){
$user_arr[$user_id]++;
var_dump($user_arr,array_sum($user_arr));
$arr1=range(2,6);
shuffle($arr1);
$arr2=range(2,6);
shuffle($arr2);
$user_arr = array(6,6,6,6,6,6,6,6,6,6);
for ($i=0;$i&10;$i++){
if($i&=4){
$user_arr[$i] += $arr1[$i];
$j = $i%5;
$user_arr[$i] += $arr2[$j];
var_dump($user_arr,array_sum($user_arr));
function rand_red($min,$max,$num,$count){
$return=[];
$shenyu=$count-($min*$num);//每个人分6块剩余的金额
$rand_num=$max-$//最大分配
$mt_rand_min=1;//剩余金额最小值 默认分1
for($i=1;$i&=$$i++){
$num_count=mt_rand($mt_rand_min,$rand_num);//随机分配金额
if($shenyu&$num_count){
$shenyu=$shenyu-$num_
$mt_rand_min=$shenyu/($num-$i);//计算剩余小值
$red_num=$min+$num_//最少分配加上 max-min随机值
$return[]=$red_
if($shenyu!==0){
$red_num=$min+$
$shenyu=0;
$return[]=$red_
$return[]=$rand_
$arr=rand_red(6,12,10,100);
var_dump($arr);
var_dump(array_sum($arr));
借鉴了楼主思路
英文不好 变量命名不是很标准 别喷~ 期待更好随机性解析代码
$allMoney = 100;
$peopleNum = 10;
//红包结果
$result = [];
//随机生成10个红包
for ($i=0;$i&$peopleN$i++){
$result[$i] = mt_rand(6,12);
//取结果总钱数差
$diff = array_sum($result) - $allM
$absDiff = abs($diff);
//多退少补
for($i=0;$i&$absD$i++) {
foreach ($result as $key =& $value) {
if ($diff & 0) {
if ($value &= 6) {
$result[$key] = $
} elseif ($diff & 0) {
if ($value &= 12) {
$result[$key] = $
//输出红包结果
var_dump($result);
//输出红包总钱数
var_dump(array_sum($result));
可能写复杂了,突然想到的就这样了。
还有更简单粗暴的,效率也还行。
function makePaper()
$result = [];
for ($i=0;$i&10;$i++){
$result[$i] = mt_rand(6,12);
if (array_sum($result) != 100) {
return makePaper();
最后就是精确到分为单位的,上面两种方法都可以这么改造。除了人数所有数量乘以一百,运算完之后再除以一百。
function makePaper($allMoney = 100, $peopleNum = 10, $min = 6, $max = 12)
$result = [];
for ($i=0;$i&10;$i++){
$result[$i] = mt_rand($min*100,$max*100);
if (array_sum($result) != $allMoney*100) {
return makePaper();
return array_map(function($money){
return bcdiv($money,100,2);
},$result);
$result = makePaper();
var_dump($result);
var_dump(array_sum($result));
写这么多还被踩,也不给个理由。什么情况?
我从题目中获取的信息是这样的:1、总数是100;2、10个人分;3、最小6块;4、最大12块;5、红包分完(例如都是6块的情况不存在)。思路:先从总数中扣除最小红包,保证每个红包的最小基数,设置一个奖金池,奖金池等于总是减去保底红包;每个人实际领到的红包 等于 红包基数 加上 从奖金池中获取的随机奖金;
随机奖金会判断当前奖金池数量 与 剩余人数之间的关系,决定最小奖金的大小:minSignal&① restNum * range &= restPool : 每个人得到最大奖金依然没有(刚好)分配完奖金:retrun range;② (restNum-1) * range & restPool : 判断下一次剩余人员能否分配完奖金池,如果能,则本次随机区间在[0,range]③ restNum&range & restPool & (restNum-1)&range : 不能,则随机区间在[restPool % range,range]
function demo(total, min, max, num){
var pool = total - min *
var restNum = // 剩余人数
var restPool = // 剩余奖金
var minSignal = function(){
var range = max - // 最大奖金
return restNum * range & restPool ? (restNum-1) * range & restPool ? 0 : restPool % range :
var dispatch = function (){
var minS = minSignal();
var temp = minS + Math.random() * ( max - min - minS);
temp = temp & restPool ? restPool :
restPool -=
return min +
for(var i = 0; i & i++){
var prize = dispatch();
restNum --;
console.log("第"+ (i+1) +"个人:" + prize ,"剩余奖金池:" + restPool);
demo(100, 6 , 12, 10)
12:57:29.056 VM9998:19 第1个人:8.712 剩余奖金池:37.29
12:57:29.056 VM9998:19 第2个人:11.778 剩余奖金池:31.508
12:57:29.056 VM9998:19 第3个人:9.48 剩余奖金池:27.027
12:57:29.057 VM9998:19 第4个人:9.432 剩余奖金池:24.597
12:57:29.057 VM9998:19 第5个人:6.364 剩余奖金池:23.233
12:57:29.057 VM9998:19 第6个人:11.884 剩余奖金池:18.35
12:57:29.057 VM9998:19 第7个人:11.266 剩余奖金池:12.083
12:57:29.057 VM9998:19 第8个人:10.255 剩余奖金池:7.829
12:57:29.057 VM9998:19 第9个人:10.269 剩余奖金池:2.56
12:57:29.057 VM9998:19 第10个人:8.56 剩余奖金池:0
我写了个思路迥异的。。。感觉有点麻烦,不过效率和可扩展性还凑合。
思路:每次分配后,都确定剩余的金钱在合理范围。若合理,进行下次分配否则,重新进行此次分配。
function hongbao($money, $people, $min, $max)
$result = [];
for ($i=0; $i & $ $i++) {
// 1.进行本次分配
$result[$i] = mt_rand($min*100, $max*100) / 100;
// 2.本次分配后,剩余人数
$restPeople = $people - ($i+1);
// 3.本次分配后,剩余金钱
$restMoney
= $money - array_sum(array_slice($result, 0, $i+1));
// 4.本次分配后,剩余金钱是否在合理范围? 不在则重新分配
} while ($restMoney & $restPeople * $max || $restMoney & $restPeople * $min);
$result = hongbao(100, 10, 6, 12);
var_dump($result);
var_dump(array_sum($result));
运行结果:
function hongbao($money, $people, $min, $max) {
if($people * $min & $money || $people * $max & $money) {
$result = [];
for($i = 0;$i & $ ++$i) {
if($i == $people - 1) {
$result[$i] = $money - array_sum($result);
$rand = mt_rand($min * 100, $max * 100)/100;
while(!isset($result[$i])) {
$restMoney = $money - array_sum($result) - $
if($restMoney & ($people - $i -1) * $max) {
$rand += 1;
$rand & $max && $rand = $
} elseif($restMoney & ($people - $i - 1) * $min) {
$rand -= 1;
$result[$i] = $
$result = hongbao(100, 10, 6, 12);
print_r($result);
print_r(array_sum($result));
?&整个算法时间复杂度比较稳定
如题,首先要获取大于6小于12的随机数,那么只要我们随机出0-6的随机数,并且加上6,就是符合要求的。然后这个是红包,按照微信红包的需求来设计,那么随机数是有两位有效小数的。那么我们需要随机出0-600的随机数,然后除以100。因为这种设计,所以随机出来的数值一定大于6,所以6这边边际问题,就解决了,只需要考虑12的情况。
随机出来一个数字,只要确保后面的n位数字的平均值不大于600就可以。
//生成随机数的和
$total = 4000;
//随机数总和不能大于4000
$num = 10;
//生成num个随机数
$factor_start = 0;
//优化算法效率,在一定情况下,提高系数,可以随机数的效率。
$factor_end = 600;
//后面能随机的值不够时,需要控制后面随机数的范围。
$rand_num = array();
foreach($i==1;$i&=$$i++){
if($i==10){
$rand_num[9] = 6 + ($total - $sum)/100;
$rand = mt_rand($factor_start,$factor_end);
$tmp_sum = $sum + $
if((($total - $tmp_sum) / ($num - $i)) & 600){
$rand_num[] = 6 + $rand / 100;
if($total - $sum&=600){
$factor_end = $total - $
$factor_start += 100;
}while(true)
var_dump(shuffle($rand_num));
//重新打乱数组,并输出
算法就是这样,结果一定是正确的。算法中添加的$factor_start和$factor_end变量,就是为了提高算法效率。假设前面的随机数都很小,那么后面的随机数就要大起来。这个时候就需要增大$factor_start,减少后面while循环次数,提高算法效率。
假设前面的随机数特别大,让后面的数,无法满足0,到600的随机,那么就通过$factor_end来控制。
这个问题很简单,100块给10个人,那么平均数就是10,先随机一个6到12的数,如果小于10,那么剩下的钱除以9肯定平均数大于10,那就在10到12随机一个数,然后把剩下的钱除以8,如果平均数大于10继续在10到12里面随机,如果小于10,那么就在6到10之间随机,由此类推得到10个随机数。然后把这10个随机数打乱分给10个人。
我的想法是采用递归来实现,代码如下:
//rem,当前递归层次还有多少个数没有生成,$total生成总量,在这个项目中为40,$must必须达到的数据,$arr,临时变量用来保存和传递用
//返回类型,$arr,即生成的随机数组
function test($rem, $total, $must, $arr)
if($rem&=2)
$rem -= 1;
//$min本轮生成随机数的最小值是多少
$min = round($must - $rem * 6 , 2);
if($min&=0)
$max = ($must & 6) ? 6 : $
$rand = round(mt_rand($min*100, $max*100)/100 , 2);
$arr[] = $
$must = $must - $
echo "生成rand数值:".$
echo "--剩余随机次数:".$rem."----必须达成数据:".$
echo "&br&";
return test($rem, $total, $must, $arr);
$arr[] = $
$arr = array();
$brr = test(10, 40, 40,$arr);
//以后如果我想得到5个人分20块钱,也可以直接调用
//test(5,20,20,$arr)即可
print_r($brr);
最后生成的结果如下 :
生成rand数值:0.41--剩余随机次数:9----必须达成数据:39.59
生成rand数值:0.81--剩余随机次数:8----必须达成数据:38.78
生成rand数值:5.72--剩余随机次数:7----必须达成数据:33.06
生成rand数值:2.51--剩余随机次数:6----必须达成数据:30.55
生成rand数值:1.25--剩余随机次数:5----必须达成数据:29.3
生成rand数值:5.34--剩余随机次数:4----必须达成数据:23.96
生成rand数值:5.98--剩余随机次数:3----必须达成数据:17.98
生成rand数值:5.99--剩余随机次数:2----必须达成数据:11.99
生成rand数值:6--剩余随机次数:1----必须达成数据:5.99
Array ( [0] =& 0.41 [1] =& 0.81 [2] =& 5.72 [3] =& 2.51
[4] =& 1.25 [5] =& 5.34 [6] =& 5.98 [7] =& 5.99 [8] =& 6 [9] =& 5.99 )
相当于生成 10 个 [0, 6] 之间的随机数,并且让它们和为 40,然后再每个数加上 6 即可。
如果用 Python,可以这样实现:
import random
r = [6] * 10
for i in range(40):
r[random.choice([i for i in range(10) if r[i] & 12])] += 1
X为已经抽取的数值Y为已经抽取的人数
思路:因为100块分10个人,可选范围是6到12。所以可以随机地在6~12分给全部人就可以了。但可能会出现派不完或者不够分的情况,所以实际上每个人的选择区间不一定是6~12,也取决于先抽到钱的人。假如他们都抽到的金额接近总体平均值,那么这个区间就会保持在6~12,假如连续开头三个人都抽到6,那么第四个人的区间就会缩小,下限会提高。然而一旦她抽到了12,又会让下一位的选择区间变大了一点。但总体来看,越接近尾声,选择区间会缩小,直到最后一个人选择时,他的选择上限和下限是恰好相等的。所以用图来描述这个动态区间,比较有意思的是像一种时间线流动一样,从最底三层都是6~12,6~12,6~12,然后后面会随着具体的数值发生变化,你也永远无法知道下一个数是什么。
这里满足四个条件:1.剩余金额除以人数不能大于122.剩余金额除以人数不能小于63.每个人都只能在6~12里选4.总金额100分为10个人
m为总金额,n为人数,min选择下限,max为选择上限,用方程式
方程式为 min &= (m-x-z)/(n-y-1) &= max,配平就可以
下面是已经配平的式子,式子分别为上限和下限。上限可大于12时,配成12,否则保留。下限同理。
我不懂php,用python来代替:(我的代码写得很不pythonic请不要吐槽,位数采用默认的很多位小数,根据实际情况再进行削减)
#encoding=utf8
from random import uniform
def flag(m, n, min, max):
for i in range(n):
bottom = 6
if not m-x-min*(n-y-1) &= 12:
top = m-x-min*(n-y-1)
if not m-x-max*(n-y-1) &= 6:
bottom = m-x-max*(n-y-1)
next = uniform(bottom, top)
L.append(next)
print flag(100, 10, 6, 12)
print sum(flag(100, 10, 6, 12))
优点是,我得出下一位数永远时即时运算的,它不是得出一个既定的组合,然后再分配给每一个人。而是根据前面的情况,即时产生下一个结果。在具体用户上,当然是没有区别,但我在思考红包这个玩意的时候,也很自然觉得要是提前分好一个模式给我,那其实下一个数是什么早有了定论,程序员log一下就能知道是什么,那样就不好玩了。另外红包派不完的情况下,我无需去记录已经分配好的模式又在过期后对它进行删除的操作。这里在随机前进行判断来缩小区间,比随即后判断是否满足条件要好那是因为,选择出来的数符合逐渐变小的区间可能性会越来越低,结果在数据规模更大时,性能会下降严重。而先判断出上下区间则保证整个计算过程长度不变,都是常数级。
缺点是,如果不作另外的解释和运算,根本不知道上面这是在算什么,思路也不明了。
=================
更新,有评论提到越后抽越多money的问题,是的:
这个是因为人均10元,下限6元比平均低4元,上限12元才高2元,不对称同时金额分10人最高只有12这个空间“拉得很紧”,所以前三个都是100%在6~12所以无问题,后面就出问题了。这样有一个问题,就是出现了明显的规律,越后面越可能大。
毕竟这里均值达到10,每抽到1个人抽到6就需要2个人抽到12来弥补,所以要么让它更为集中到10,要么分散到2端,同时后面那端要比前者的高很多,而均匀分布是不可能的。因为这里涉及到红包,红包分定额和随机两种。集中分布可以说是固定金额的近似值,所以一定要做两端分布,两端分布可以在区间随机前对区间进行权重选择再随机就能操控,另外,也可以每次随机都生成10次数据,然后再从中抽取一个出来,其他删掉,第二个人抽再根据第一个数据生成第二个数列一直到结束,就能做到“分布均匀”,但题目中的数据限制还是很多人会抽到很大的数,的确在所难免。
集中化只要为每个数据根据它的位置乘上相关系数解决。或者直接设为10,然后设定“随机抖动”= = 。
因为数学的好处所以这个性能完全是常数级的,执行步数每次都是一样的,不存在要把自己的算法的性能也连同一起和所需生成的数据一起来随机玩概率的问题。所以想要两端分布同时随机分布这里可以在最后生成的答案里加上随机选一个就能达到效果。但算法之外是这个抢红包的问题,到底是集中还是分散分布?或许很多人抢时最后的红包才大还是好事情,抢早了,红包小了,迟了,被抢光了,最后一个是最危险的也是概率上金额最大的那一个,有意思不?或者说,我喜欢平均一点,既要和某人玩随机金额才刺激,还要避免某人抽得太小而尴尬?所以最后还得看实际需求怎样才能决定。
PS:看到题主的评论,题主的思路有人提到是随机到6块这种的概率很低,假如真的如此(偷懒没试过),那算法直觉就是集中化趋势的过程了。没有好坏,只是看需求如何。
// 1.初始化,平均分配每人$initAvgMoney(根据限制条件随机产生)
// 2.每人随机拿出一定金额到共享资金池中,进行重新分配
// 限制条件:$initAvgMoney应满足条件:"小宝"一分钱也不放入共享资金池("特自私"),其余九人拿出尽可能多的钱到共享资金池(每人只留6元)的情况下,共享资金池平均分配后小宝的钱也不超过12块
header("Content-type:text/charset=utf-8");
$minInitAvgMoney = 600;
// ($maxInitAvgMoney - 600) * 9 / 10 + $maxInitAvgMoney &= 1200;
$maxInitAvgMoney = floor(1740 / 1.9);
echo("maxInitAvgMoney:");var_dump($maxInitAvgMoney);
$initAvgMoney = mt_rand($minInitAvgMoney, $maxInitAvgMoney) ;
echo("initAvgMoney:");var_dump($initAvgMoney);
$maxMinus = $initAvgMoney - 600;
echo("maxMinus:");var_dump($maxMinus);
$moneyArr = array();
for($i = 0; $i & 10; $i ++){
$randMinusArr[$i] = mt_rand(0, $maxMinus / 10) * 10;
// echo("randMinusArr-{$i}");var_dump($randMinusArr[$i]);
$moneyArr[$i] = $initAvgMoney - $randMinusArr[$i];
$randMinusSum = 10000 - $initAvgMoney * 10 + array_sum($randMinusArr);
$avgAddMoney = $randMinusSum / 10;
for($i = 0; $i & 10; $i ++){
$moneyArr[$i] = ($moneyArr[$i] + $avgAddMoney) / 100;
echo "最终结果:";var_dump($moneyArr);
echo "结果验证:";var_dump(array_sum($moneyArr));
// 感觉还有可以完善的地方,先这样吧
先每个人分6分,然后把剩下的钱再分这个时候取10个随机值(0-9)随意,然后取各个值在随机值总和的百分比,分别乘以剩下的10000-60;Math.ceil或者Math.floor都可以最后一个值防止取ceil时溢出,直接用10000-60-前面九个数的和即可然后分别加上6,换算即可
根据题主的思路写了这样的一个答案
function faHongBao(money, pe, min, max) {
var sum = money,
result = [];
for(var i=0; i& i++) {
result.push(min);
while(sum & 0) {
var ran = Math.floor( Math.random() * (pe - 1) );
if(result[ran] & max) {
result[ran]++;
一个do while循环就能解决的问题,搞那么复杂。
$people = array_fill(0, 10, 6);
$lucky_index = mt_rand(0, 9);
$lucky_money = floatval(substr(mt_rand() / mt_getrandmax(), 0, 4));
if($people[$lucky_index]+$lucky_money &= 12)
if($money & 1) {
$m = $lucky_
$people[$lucky_index] += $m;
$money -= $m;
} while($money & 0);
print_r($people);
100元,给10人;范围6-12元1,每人先发6元。 剩下每人最多还能分到6元。 剩下40元2,如果按照整元分; 那么等价于40元分到60个槽。。。3,如果要精确到分, 那么等价于40 00 分 分到 60 * 100个槽。。。
当剩余红包金额小于等于12 * 剩余红包个数且大于等于6 * 剩余红包个数,则将随机数加入到结果中.
function makeSeq(){
$sum = 100;
$result = [];
while ($n & 1) {
// 6n &= sum &=12n
$randNum = mt_rand(600,1200) / 100;
if(($sum-$randNum) &= 6* ($n - 1) && ($sum-$randNum) &= 12* ($n - 1)){
$sum -= $randN
$result[] = $randN
$result[] = $
print_r(makeSeq());
print_r(array_sum(makeSeq()));
7.20更新高新能版
function makeSeq2(){
$sum = 100;
$result = [];
for($i=$n;$i&=1;$i--){
$min = ($sum - 12 * ($i-1))&6?($sum - 12 * ($i-1)):6;
$max = ($sum - 6 * ($i-1))&12?($sum - 6 * ($i-1)):12;
$randNum = mt_rand($min,$max);
$sum -= $randN
$result[] = $randN
楼主的方法只能处理整数问题吧,题目中并没有交代一定是整数。每次取随机的范围都是变化的下限从6和(剩余钱数-12*(剩余人数-1))中取大的上限从12和(剩余钱数-6*(剩余人数-1))中取小的贴Java代码
public class Allocation{
public static final double Total = 100;
public static final double Min = 6;
public static final double Max = 12;
public static final int peopleNum = 10;
private static double money_
public static double[] allocateMoney(){
double[] result = new double[10];
money_left = T
double lowerBound = M
double upperBound = M
double money_now = 0;
double sum = 0;
for (int i = 0; i & peopleN i++) {
lowerBound = Min & money_left - Max*(peopleNum-i-1)?Min:(money_left - Max*(peopleNum-i-1));
upperBound = Max & money_left - Min*(peopleNum-i-1)?Max:(money_left - Min*(peopleNum-i-1));
money_now = (upperBound - lowerBound)*Math.random()+lowerB
System.out.println((i+1)+" : " + money_now);
result[i] = money_
sum += money_
money_left = money_left - money_
System.out.print("Total = " + sum);
public static void main(String[] args) {
allocateMoney();
某次运行截图
答案真多,也没仔细看, 不知道有没有和我一样想法的。
我的总体思路是这样的:先均分6块;再分析每个人得钱的随机范围;每个人依次得钱直至分完,一次就分完了。
1、每人至少6块,所以先分出60,剩下40。那剩下人的每个人能得到的初看是[0~6];2、反推。从最后一个人(第10个人)推起,到他时,剩下的钱必定是&=6,继续往前推一个,到他时,剩下的钱必定是&=12,然后依次类推(最好在纸上写一下)。这么推我们可以得出到第5个人得钱时,剩下的钱必定是&=36, 那么前4个人必须要分掉至少4块钱,以此再推,前5个人必定要分掉至少10块钱,至最后一个至少得分掉34块钱。这样通过找规律我们得出了每个人得钱的随机范围的第一个值。3、虽然我们得出了每个人随机范围的第一个值,但并不是每一个人的随机范围的第二个值都是 6,因为当前面的几个人已经把大部分钱都分了的时候,后面的人就没得分了。这次,我们从第一个人开始往后推,当到第N个人时剩下的钱$R&6时,这个人所能分得的钱的随机范围第二个值就是剩下的钱$R,然后他后面的人所能分得的钱的随机范围的第二个值还是$R;
说明完毕,也不知道有没有说明白,还是直接上代码吧:
//剩余钱数
$add_max = 12 - 6;
$arr = array(6, 6, 6, 6, 6, 6, 6, 6, 6, 6);
for($i = 0; $i&10; $i++) {
//默认随机数是 0~6
$rand = mt_rand(0, $add_max);
//反推过程可以得出从第4个人开始,rand要么是以$diff为初始值,要么就是上一行的$而随机范围第二个值由剩余钱$R决定。
if($i & 2) {
if($R &= 0)
$diff = $R - (10 - $i - 1) * $add_
$rand_end = $R & 6 ? $R : $add_
$diff & 0 && ($rand =
mt_rand($diff, $rand_end));
$arr[$i] += $
var_dump($arr,array_sum($arr));
这里得出的都是整型的,如果要得到浮点数,把rand函数替换成获得浮点数的随机函数就行。这是稍微精简后的,通俗过程:
$add_max = 12 - 6;
$arr = array(6, 6, 6, 6, 6, 6, 6, 6, 6, 6);
for($i = 0; $i&10; $i++) {
//根据反推,前三个是不用考虑随机范围的,从第4个人开始才需要考虑随机范围
if($i & 3) {
$rand = mt_rand(0, 6);
} else if($i == 3) {
//留给第5个人的不能超过36。当$rand_start不为0时,说明钱还很充足的。充足到第$i个人必须抽走一些钱才行。
$rand_start = $R - 36 ? $R - 36 : 0;
$rand = mt_rand($rand_start, 6);
} else if($i == 4) {
//留给第6个人的不能超过30.
$rand_start = $R - 30 ? $R - 30 : 0;
$rand = mt_rand($rand_start, 6);
} else if($i == 5) {
//留给第6个人的不能超过24.到现在为止,钱一定还是充足的,所以不用考虑第二个值。
$rand_start = $R - 24 ? $R - 24 : 0;
$rand = mt_rand($rand_start, 6);
else if($i == 6) {
//通过上面得出留给下一个人的不能超过 (10-$i-1)*6;
然后到第7个人时,假设前面每个人都得到了6块,即只剩下4块钱时,随机范围第二个数就不再是6了,而是剩余数$R
$rand_start = $R - 24 ? $R - 24 : 0;
$rand_end = $R & 6 ? 6 : $R;
$rand = mt_rand($rand_start, $rand_end);
$arr[$i] += $
困死了,不写了
$arr = [];
for ($i=0; $i & 9; $i++) {
$arr[] = mt_rand(6,12);
array_push($arr, 100 - array_sum($arr));
var_dump($arr);
var_dump(array_sum($arr));
数学模型为:取随机数 x & s,范围为 [a, b],另一个条件是:s-x:[(n-1)a, (n-1)b] ==& x: [s-(n-1)a, s-(n-1)b],其中 s, n, a, b 分别是题中的 金额(100),人数(10),下限(6),上限(12)php 没用过,用python的生成器可以简单的实现:
import random
def hongbao(s, n, a, b):
for i in range(n-1, -1, -1):
x = random.randint(max(a, s-b*i), min(b, s-a*i))
function roundmoney()
$cash=100;
for ($i = 0; $i & 10; $i++) {
$people[$i]=rand(6,12);
$cash=$cash-$people[$i];
if($cash==0&&$i==9)
while(true)
if(($res=roundmoney())!=false)
var_dump($res);
感觉有点粗暴,就是完全让计算机随机分,什么时候刚好分够10个人并且每个人不少于6不大于10 就停止
你的想法基本靠谱,我认为可以这样分:1.先每人分6元,还剩下40元。2.起一个循环,每人分0-(12-他已有的钱)元随机,直到钱分完为止。没有题主讲的这么麻烦的。
半夜看到这个问题,忽然想到二分法那种模式,于是搞了一个解决方案,先讲思路。1.先将人分为两半,左半人分的总金额最少是左半人数x最少金额和总金额-右半人数x最多金额两个数字中较大的;2.左半人分的总金额最多是左半人数x最多金额和总金额-右半人数x最少金额两个数字中较小的;3.在这个范围内取随机数作为分给左半人的金额,然后将问题递归为左半人分钱和右半人分钱。py代码(直接以分为单位,数字都是整数):
import random
def deliver(sum_of_money,num_of_people,min_of_money,max_of_money):
if num_of_people==1:
arr = [sum_of_money]
return arr
half = num_of_people&&1
border_left = max(min_of_money*half,(sum_of_money-(num_of_people-half)*max_of_money))
border_right = min(max_of_money*half,(sum_of_money-(num_of_people-half)*min_of_money))
sum_of_left = random.randint(border_left,border_right)
arr_left = deliver(sum_of_left,half,min_of_money,max_of_money)
arr_right = deliver(sum_of_money-sum_of_left,num_of_people-half,min_of_money,max_of_money)
return arr_left+arr_right
list = deliver(,1200)
print list
static void Main(string[] args)
int all = 100;//总金额
int person = 10;//人数
double min = 8;//最小金额
double max = 12;//最大金额
double[] array = new double[person];//分配结果集
int i = 0;//第几人
Random ran = new Random();
//默认分配最小值
for (i = 0; i & i++)
array[i] =
double yet = min *//已分配金额
int whileTimes = 0;//记录循环次数
while (yet & all)
double thisM = Math.Round((ran.NextDouble() * (max - min - 1)), 2);
i = ran.Next(0, person);
if (yet + thisM & all)
thisM = all -
if (array[i] + thisM & max)//判断是否超出最大金额
array[i] += thisM;
yet += thisM;
whileTimes++;
Console.Write("共循环{0}次\r\n", person + whileTimes);
for (i = 0; i & i++)
yet += array[i];
Console.Write("第{0}人=&分配{1}元,合计分配{2}元\r\n", i + 1, array[i], yet);
Console.Read();
function randMoney($totalMoney, $people, $max, $min)
if ($max * $people & $totalMoney || $min * $people & $totalMoney) {
throw new Exception("总金钱不可以大于最大值与人数的乘积,不可以小于最小值与人数的乘积", 1);
return [];
= round(($people * $max - $totalMoney) / ($people - 1), 2) + 0.01;
$restMoney = $totalM
while ($restMoney) {
for ($i = 0; $i & $ $i++) {
if ($restMoney & 0) {
if ($restMoney &= $min) {
$currenRand = $restM
$currenRand = $max - $
if ($restMoney &= $minRest) {
$rand = $restM
$rand = mt_rand(0.00, $currenRand * 100) / 100;
if (isset($result[$i])) {
if ($result[$i] + $rand &= $max) {
$result[$i] += $
$restMoney -= $
$result[$i] = $min + $
$restMoney -= $result[$i];
if (!$restMoney) {
$result = randMoney(100, 10, 12, 6);
var_dump($result);
echo array_sum($result);
} catch (Exception $e) {
echo $e-&getMessage();
按照平均法求出X和YX+10Y = 100;X+Y&=12;故X的值为20/9(借鉴了上一位回答者的回答)
min = 6;
max = 12;
total = 100;
maxTotal = max*pe -
list = array();
for (0&pe)
if(maxTotal&0)
temp = random(0,maxTotal&=6?6:maxTotal);
maxTotal-=
list.push(12-temp);
if(maxTotal&0)
pre = maxTotal/
for (0&pe)list[temp2]+=pre;
shuffle(list);
此方法是错误的,没有强迫症,不修改了
这么多人会,就我不会
根据楼主我实现一种
import java.util.ArrayL
import java.util.L
import java.util.R
public class RandomMoney {
public static void main(String[] args) {
int len = 10;
float allMoney = 100;//总钱数
float remainMoeny = 0;//剩余得钱数
float randomMoney = 0;//随机生成得钱数![图片描述][1]
float sumMoney = 0;//每次随机生产钱数得总和
//随机索引
float oneM//某一次随机得钱数
List&Object& list = new ArrayList&Object&();
random = new Random();
for (int i = 0; i & i++) {
list.add(6f);
sumMoney = sumMoney(list ,len);
Long star = System.nanoTime();//System.currentTimeMillis();
while ((remainMoeny = allMoney - sumMoney) & 0) {
//产生一个剩余钱下的随机数
index = random.nextInt(10);
//当剩余得钱数少于一角 就把剩下得随机给某一个
if (remainMoeny & 1f&&remainMoeny & 0) {
//某一个人的钱数
oneMoney = (float)list.get(index)+(allMoney-sumMoney);
if (oneMoney & 12f) {
list.set(index, oneMoney);
sumMoney = sumMoney(list, len);
System.out.println(list);
System.out.println(sumMoney);
//随机生产得钱数
randomMoney = random.nextInt((int)remainMoeny)+random.nextFloat();
//某一个人得钱数
oneMoney = (float)list.get(index)+randomM
if (oneMoney & 12f) {
list.set(index, oneMoney);
sumMoney = sumMoney(list , len);
long end = System.nanoTime();//System.currentTimeMillis();
System.out.println(end-star);
public static float sumMoney(List&Object& list ,int len){
float sumMoney = 0;
for (int i = 0; i & i++) {
sumMoney += (float)list.get(i);
return sumM
function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
function getRandParcent(){
return rand(1,10)/rand(10,100);
function randUserMoney($cash,$min=6,$max=12){
$cash_ini = $
$user_arr = array($min,$min,$min,$min,$min,$min,$min,$min,$min,$min);
$start = microtime_float();
while($cash&0){
$user_id = rand(0, 9);
$rand_point = getRandParcent();
if($user_arr[$user_id]&$max){
$ing = microtime_float();
if($ing-$start&0.01){
return randUserMoney($cash_ini);
$rand_money = round($rand_point*$cash,2);
$user_money = $user_arr[$user_id]+$rand_
if($user_money&$max){
$user_arr[$user_id] = $user_
$cash = $cash - $rand_
'user_money'=&$user_arr,
'total_money'=&array_sum($user_arr),
'excute_time'=&$ing-$start
var_dump(randUserMoney(40));
array (size=3)
'user_money' =&
array (size=10)
0 =& float 11.59
1 =& float 9.07
2 =& float 11.99
3 =& float 12
4 =& float 9.14
5 =& float 11.6
6 =& float 11.86
7 =& float 9.93
8 =& float 6
9 =& float 6.82
'total_money' =& float 100
'excute_time' =& float 0.166
就是每个人都减去6块钱,这样问题就转变成40块分给10个人,没人不多于6块钱。这样做的核心是,把两个限制变成了一个限制,因为分到的钱一定是正数,所以大于0这个限制变得简单了。
剩下的分,在总钱数大于6块的时候,只要做一个0到6的随机就可以,小于6块的时候,做0到这个总数的随机就可以,最后一个人拿剩下的。
function fhb($money,$num,$min,$max){
$firstUse=$num*$
$surplusMoney=$money-$firstU
$arr=array();
for($i=1;$i&=$$i++){
$diff=$surplusMoney*100;
while($diff&0){
$randUid = rand(0, $num - 1);
if($arr[$randUid]&$max){
$arr[$randUid]+=0.01;
$arr[$randUid]=number_format($arr[$randUid],2,'.','');
$a=fhb(100,10,6,12);
此算法的特征是每个人分得比较均衡。
[0] =& 9.75
[1] =& 9.84
[2] =& 10.06
[3] =& 10.15
[4] =& 9.94
[5] =& 10.17
[6] =& 10.00
[7] =& 10.24
[8] =& 9.86
[9] =& 9.99
阅读(...) 评论()

我要回帖

更多关于 才能有哪些 的文章

 

随机推荐