欢迎来到「我是真的狗杂谈世界」,关注不迷路
背景/前言
最近遇到了两个可以转化为本文题目问题的需求点(具体需求在下面应用节选会讲到),决定整理和记录下来。
技术问题描述
- 问题:给定一个连续且有限的值范围(从min到max,步长为step),从中随机取出不重复的n个值。
- 举例:从108~10086的整数范围内,取出10个不重复的随机数。
技术问题方案
解决问题总会有一些通用的思想,比如:穷举、分治、迭代、倍增、回溯、贪心、动规
那运用这些思想可以想到如下解法(当然还会有别的解法)
粗暴随机法
- 维护一个结果集
- 在范围内生成一个随机数,并判断随机数是否在结果集内
- 随机数不在结果集内则加入结果集,并回到2步骤直至结果集内数量满足
- 随机数在结果集内则直接回到2步骤直至结果集内数量满足
function unique_rand($min, $max, $num) {
$count = 0;
$return = [];
while ($count < $num) {
$return[] = mt_rand($min, $max);