php 处理生成不重复随机数的问题解答
前提:
今天看到一个帖子,看到有人要生成一个数组,这个数组里面有10个元素,都是整形,并且是1-60之间不重复的随机数。
当然,这个题不难! 底下是论坛回复的解答。
代码:
<?php
function get_randoms($min,$max,$num){
$count = 0;
$res = array();
while($count<$num){
$res[] = mt_random($min,$max);
$res = array_flip(array_flip($res));
$count = count($res);
}
return $res;
}
$result = get_randoms(1,60,10);
?>
在这里 他用$count 结果数组的个数,他在while 循环中 使得结果数组的个数小于 目标个数。通过这样,获取到$count 是 目标个数 的一个数组。
期间,每一个循环中,通过mt_random($min,$max),随机出区间内的一个值,存放到数组$res中,然后通过两次key-value 交换,也就是通过数组key的唯一性,使得做到不重复。
我看了这个逻辑的代码之后,我不禁陷入了深思,假如说当你不知道array_filp 函数的时候你怎么做?
说白了就是用key的唯一性,使得随机数不会存在重复。那么我们能不能将这个问题简单化处理呢?
代码:
<?php
function get_randoms($min,$max,$num){
$count = 0;
$res = array();
while($count<$num){
$key = mt_random($min,$max);
$res[$key] = $key;
$count = count($res);
}
return $res;
}
$result = get_randoms(1,60,10);
?>
这样以来,我们完全是单独的通过数组key的唯一性 解决了这个问题。根本就不会用到array_flip。
通过上述,我提出两个观点。
一:因为php为我们提供了大量的内置函数,他们的执行效率都很高。 我们在遇到问题的时候,尽可能 的去用它去解决问题。这样方便而且快速。 所以,我们日常工作学习,尽可能的积累足够多的php函数,并且深刻的理解它们。
二: 虽然php 给我们提供了大量的内置函数,执行效率也很高,但是,我想指出,虽然效率高,还是需要时间去执行的。我们在遇到问题的时候,不要盲目的去做,可以先看清处理方法的本质,以便于我们去巧妙的实现他。
分享到:
相关推荐
VBA生成不重复的随机数源码.txt
VB生成不重复的随机数 我的建议是:第一步、先做一个数组,存上这35个数(可以不是连续的数,也可以是人名、字符串什么的);第二步、随机生成一个1-35之间的数,输出;第三步:把这个数和数组的第一个单元交换;第...
VB.NET生成不重复的随机数源程序。 VB.NET生成不重复的随机数源程序。
生成指定随机数不重复的例子(解压,放到myeclipse即可用)
多种生成不重复随机数的java 源代码,在线考试系统组卷系统中若需要随机抽题技术,这些代码可能会帮上忙!
易语言取不重复随机数源码,取不重复随机数
.NET生成不重复的随机数,源文件..常用的设置
巧用Java实现得到任意位永不重复的随机数,很经典的代码!
通过循环创建随机种子来循环生成随机数,避免了重复调用Random的Next方法产生重复随机数的问题,程序里可设置文件的保存路径和产生的随机数长度
Java生成32位随机数,短位随机数工具类
java生成十个不重复的随机数,要求不重复
VB.NET生成1-10不重复随机数.重点是生成随机数,而且不重复。
易语言取不重复随机数.rar
java生成16位随机数
取不重复随机数.rar
代码如下:Randomize ‘纯随机,不重复 Response.write Int((999999999 * Rnd) + 111111111) ‘生成111111111到999999999之间随机数 ASP不重复随机数:方法一: 已测使用的时候需要注意里面的分割字符串的字符。 代码...
C#产生不重复的随机数.txt
利用matlab,生成柯西分布随机数,原理、代码,一键生成
1. 设计并实现一个随机数生成电路,每2秒随机生成一个0~999之间的数字,并在数码管上显示生成的随机数。2. 为系统设置一个复位键,复位后数码管显示“000”,2秒后再开始每2秒生成并显示随机数,要求使用按键复位。
首先定义一个数组,然后用sort方法把数组打乱,最后输出。可以保证是不会重复的,并且效率高。 原博链接:https://blog.csdn.net/SundayAaron/article/details/80181380