Heim >php教程 >php手册 >PHP随机数生成问题

PHP随机数生成问题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-06 19:45:541190Durchsuche

(http://www.nowamagic.net/librarys/veda/detail/2508) 有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次。前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空。那么你会如何填补这个漏子? 当然向上级反映情

(http://www.nowamagic.net/librarys/veda/detail/2508)

有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

有几点进行说明

1、生成随机数时用了 mt_rand() 函数。这个函数生成随机数的平均速度要比 rand() 快四倍。

2、去除数组中的重复值时用了“翻翻法”,就是用 array_flip() 把数组的 key 和 value 交换两次。这种做法比用 array_unique() 快得多。在每一次交换的过程中,value相同的会被最后一次值所取代。连续交换两次便能去掉重复,也是比较巧妙。

3、返回数组前,先使用 shuffle() 为数组赋予新的键名,保证键名是 0-n 连续的数字。如果不进行此步骤,可能在删除重复值时造成键名不连续,给遍历带来麻烦。

4、输出数组的时候用了substr函数,第三个变量是负数表示从倒数第二个进行返回,这样去掉最后一个逗号。

5、PHP数组的赋值过程,下标会自动的增加。



这个程序看起来确实还不错,不过我同学又写了个比较屌丝的程序。大家看看。。。

<?php $return=array();
	for ($i=1; $i <= 25 ; $i++) { 
		$return[]=$i;
	}
	shuffle($return);
	
	$result=array();
	for ($i=0; $i < 10; $i++) { 
		$result[]=$return[$i];
	}
	shuffle($result);
	sort($result);
	for ($i=0; $i < 10; $i++) { 
		echo $result[$i] . ' ,';	
	}

 ?>

。。。怎么去评价
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:php 无限分类Nächster Artikel:PHP compiled with build ID=API20090626,TS