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

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2015-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

从机器学习学python(四) ——numpy矩阵基础

从机器学习学python(四)——numpy矩阵基础 (原创内容,转载请注明来源,谢谢) 一、numpy中matrix 和 array的区别 ...

3927
来自专栏数据结构与算法

P3908 异或之和

题目描述 求 的值。  即AA , BB 按位异或。 输入输出格式 输入格式: 1 个整数NN。 输出格式: 1 个整数,表示所求的值。 输入输出样例...

33415
来自专栏文武兼修ing——机器学习与IC设计

算法复杂度分析与最大子串问题算法复杂度分析最大子序列问题

算法复杂度分析 算法复杂度基本定义 算法复杂度分析基于以下四条定义: 如果存在常数c与$n_{0}$使$N \geq n_{0} $时,有$T(N) \leq ...

2336
来自专栏编程直播室

读书笔记:《算法图解》第一章 算法简介时间复杂度#

1544
来自专栏章鱼的慢慢技术路

《算法图解》第八章_贪婪算法_集合覆盖问题

1676
来自专栏数据处理

numpy常见运算

1533
来自专栏计算机视觉与深度学习基础

POJ2836

状压DP死活想不到啊,开始还以为是数据结构题,真是膜拜宋威大大。 包括点的矩形最小一定以这些点为顶点,所以枚举所有点对,构成所有状态。 由于不存在面积为0的矩形...

17710
来自专栏数据小魔方

左手用R右手Python系列——因子变量与分类重编码

今天这篇介绍数据类型中因子变量的运用在R语言和Python中的实现。 因子变量是数据结构中用于描述分类事物的一类重要变量。其在现实生活中对应着大量具有实际意义的...

3055
来自专栏Python小屋

蒙特.卡罗方法求解圆周率近似值原理与Python实现

对于某些不能精确求解的问题,蒙特.卡罗方法是一种非常巧妙的寻找近似解的方法。 以求解圆周率的问题为例,假设有一个单位圆及其外切正方形,我们往正方形内扔飞镖,当扔...

3045
来自专栏aCloudDeveloper

算法导论第八章线性时间排序

一、线性时间排序算法历史概览       计数排序首先是由 Harold H. Seward 于1954年提出,而且他还提出将计数排序和基数排序进行结合的思想;...

1936

扫描关注云+社区