当前位置: 首页 > news >正文

PHP CodeBase: 生成N个不重复的随机数


有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次。前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空。那么你会如何填补这个漏子?

当然向上级反映情况。但是我们这里讨论的是技术,就是需要生成1-25之间的16个不重复的随机数,去填补。具体怎么设计函数呢?将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。

程序如下:

<?php
/*
* array unique_rand( int $min, int $max, int $num )
* 生成一定数量的不重复随机数
* $min 和 $max: 指定随机数的范围
* $num: 指定生成数量
*/
function unique_rand($min, $max, $num) {
    $count = 0;
    $return = array();
    while ($count < $num) {
        $return[] = mt_rand($min, $max);
        $return = array_flip(array_flip($return));
        $count = count($return);
    }
    shuffle($return);
    return $return;
}

$arr = unique_rand(1, 25, 16);
sort($arr);

$result = '';
for($i=0; $i < count($arr);$i++)
{
    $result .= $arr[$i].',';
}
$result = substr($result, 0, -1);
echo $result;
?>

程序运行如下:

2,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

补充几点说明:

    生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。
    去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。
    返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。
























有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次。前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空。那么你会如何填补这个漏子?

当然向上级反映情况。但是我们这里讨论的是技术,就是需要生成1-25之间的16个不重复的随机数,去填补。具体怎么设计函数呢?将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数。

程序如下:

01<?php
02/*
03* array unique_rand( int $min, int $max, int $num )
04* 生成一定数量的不重复随机数
05* $min 和 $max: 指定随机数的范围
06* $num: 指定生成数量
07*/
08function unique_rand($min, $max, $num) {
09    $count = 0;
10    $return = array();
11    while ($count < $num) {
12        $return[] = mt_rand($min, $max);
13        $return = array_flip(array_flip($return));
14        $count = count($return);
15    }
16    shuffle($return);
17    return $return;
18}
19 
20$arr = unique_rand(1, 25, 16);
21sort($arr);
22 
23$result = '';
24for($i=0; $i < count($arr);$i++)
25{
26    $result .= $arr[$i].',';
27}
28$result = substr($result, 0, -1);
29echo $result;
30?>

程序运行如下:

12,3,4,6,7,8,9,10,11,12,13,16,20,21,22,24

补充几点说明:

  • 生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。
  • 去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。
  • 返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。

转载于:https://www.cnblogs.com/xiaoxiaomengxiangjia/p/5303036.html

相关文章:

  • 解析stm32的时钟
  • BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
  • Material Design 控件
  • ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
  • IOS开发UI篇--IOS动画(Core Animation)总结
  • css中的单位
  • 关于退运美国转基因玉米含有MRI 162转基因成分的质疑
  • Shiro基于组织机构的登录验证
  • maven部署构建到私服
  • Android 发送短信总结
  • 笔记 - 10.4、HTML - CSS滤镜笔记
  • Java BigDecimal详解
  • javap的使用
  • java面向对象中的方法重载与方法重写的区别
  • Hadoop2.7实战v1.0之Hive-2.0.0+MySQL本地模式安装
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 4个实用的微服务测试策略
  • Android单元测试 - 几个重要问题
  • canvas 五子棋游戏
  • idea + plantuml 画流程图
  • Java Agent 学习笔记
  • JavaScript类型识别
  • MySQL用户中的%到底包不包括localhost?
  • tweak 支持第三方库
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • yii2中session跨域名的问题
  • Zepto.js源码学习之二
  • 动态规划入门(以爬楼梯为例)
  • 码农张的Bug人生 - 初来乍到
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 移动端 h5开发相关内容总结(三)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 《天龙八部3D》Unity技术方案揭秘
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 如何正确理解,内页权重高于首页?
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • !!java web学习笔记(一到五)
  • # 达梦数据库知识点
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #if和#ifdef区别
  • $.ajax中的eval及dataType
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (java)关于Thread的挂起和恢复
  • (Python第六天)文件处理
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (原創) 物件導向與老子思想 (OO)
  • (转)jQuery 基础
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)Linux 多线程条件变量同步
  • ***测试-HTTP方法