php使用codebase生成随机数


Posted in PHP onMarch 25, 2014

有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 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。

PHP 相关文章推荐
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
PHP CKEditor 上传图片实现代码
Nov 06 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
Nov 26 PHP
php&amp;mysql 日期操作小记
Feb 27 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 PHP
php中stream(流)的用法
Mar 25 #PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 #PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 #PHP
php获取域名的google收录示例
Mar 24 #PHP
php 使用GD库为页面增加水印示例代码
Mar 24 #PHP
php检测useragent版本示例
Mar 24 #PHP
php断点续传之如何分割合并文件
Mar 22 #PHP
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python实现计数排序与桶排序实例代码
2019/03/28 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
HTML5中meta属性的使用方法
2016/02/29 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
Shell如何接收变量输入
2012/09/24 面试题
革命先烈的英雄事迹材料
2014/02/15 职场文书
采购意向书范本
2014/03/31 职场文书
119消防日活动总结
2014/08/29 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
民事诉讼代理词
2015/05/25 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
如何理解PHP核心特性命名空间
2021/05/28 PHP
MySQL 时间类型的选择
2021/06/05 MySQL