当前位置: 首页 > 后端技术 > PHP

Chapter 1.有限连续范围内生成不重复随机数及其应用

时间:2023-03-30 02:18:32 PHP

第一章有限连续范围内不重复随机数的产生及其应用(具体要求会在下面的应用摘录中提到),决定整理记录一下。技术问题描述问题:给定一个连续且有限范围的值(从min到max,步长为step),从中随机选取n个不重复的值。例子:从108到10086的整数范围内,取出10个不重复的随机数。解决技术问题总有一些共同的思路,比如:穷举、分而治之、迭代、乘法、回溯、贪婪、动态规则等。运用这些思路,可以想到以下解决方案(当然还有其他方案)粗随机方法维护一个结果集,生成一个范围内的随机数,判断这个随机数是否在结果集中。如果该随机数不在结果集中,则添加该结果集,返回步骤2,直到结果集中的数与结果集中的随机数相符。然后回到第2步,直到结果集中的数满足functionunique_rand($min,$max,$num){$count=0;$返回=[];while($count<$num){$return[]=mt_rand($min,$max);//使用flip方法识别并剔除重复值$return=array_flip(array_flip($return));$计数=计数($返回);}洗牌($返回);return$return;}去掉随机方法枚举全范围,建数组(k1=min,k2=min+step,kx=min+(x-1)*step,...kn=max)生成一个每次统计k范围内的随机数a,将ka的值放入结果集中,同时用kn的值填充ka,重复2步,直到结果集中的数满足函数unique_rand($min,$max,$num){$numbers=范围($min,$max);//懒得实现了,直接使用内置的shuffle函数,然后取第一个数字shuffle($numbers);$result=array_slice($numbers,0,$num);return$result;}均匀分布法将全范围平均分成n段。从每个段中获取一个随机数,并将其放入结果集中。升级后为双随机法(但双随机法需要处理配额不足的问题)//代码偷懒,不写语言内置函数/标准中的部分语言库可能有内置的相关方法,例如/***从数组中选择一个或多个随机键*@linkhttps://php.net/manual/en/function.array-rand.php*@paramarray$array

*输入数组。*

*@paramint$num[optional]

*指定要选择的条目数。*

*@returnint|string|array如果您只选择一个条目,array_rand*返回随机条目的键。否则,它返回随机条目的键数组*。这样做是为了让您可以从数组中挑选*随机键和值。*/functionarray_rand(array$array,int$num=1):array|string|int{}技术问题场景有优缺点,需要结合具体场景分析我们先考虑影响实现的维度:rangebase:c=((max-min)/step)+1;thisvaluehasalarge/smalldimensionvaluetargetresultratio:r=n/c;这个值有Less/medium/more维度值,因为我们可以列举如下场景:c小,r少:比如3个c小,r从100生成:比如48个c小而r是从100生成的:比如从100里面有97个cbigr:比如1,000,000里面有10个cbigr:比如1,000,000里面有489,876个cbigr:比如1,000,000里面有999,9971,000,000但考虑到3和6r多的两种情况可以是情况1和4的倒置,所以合并:c小r小:比如3c和r从100生成:比如48c是从100中生成的,r小:比如从1000000中取10c大r:比如从1000000中取489876个场景和解可以混合多种解csmallrlesscsmallrmediumcbigrlesscbigrmedium粗糙随机法high1Low2High1Low2消除随机法High?3High3Low4Low4均匀分布法Low?5High6Low5High6商务应用连续抽取N个奖品需求说明:用户在抽奖环节完成特定任务后有资格参与最终游戏,在抽奖环节通过管理后台抽取中奖者,并且需要同时抽取同级别的奖品。转换关联:将符合条件的用户放在一个表中,抽取时获取最新的记录,自动递增IDN,由1转换为~N中生成X个不重复随机数来分红包(抢红包)的问题需求说明:一个房间有N个座位,每个座位可以让一个人参与单人游戏(不需要同时开始和结束),一个房间对应一定数量的红信封A,每人完成单人小游戏后可瓜分一定金额。房间初始化时,结合线分割法,转化为先从0到A生成N-1个不重复的随机数,然后用这N-1个随机数对座位切割点进行排序,形成N个随机数lengths问题r少了,不容易产生重复值,导致时间复杂度增加?在r中,容易产生重复值,导致时间复杂度增加?c小,内存可以容纳,用时间换空间?c大,内存分配消耗增加大,可能内存不足?r少,结果分布会比较均匀,如果要求随机性高,不适用?中r,结果分布本身服从概率分布,会比较均匀,所以这种方法的匹配度增加了?