PHP随机数生成的几种方法

Posted by 撒得一地 on 2016年7月16日 in PHP笔记

在PHP开发中,有一些情况下可能要使用PHP生成随机数,PHP随机数的生成方法有很多。下面介绍常用的几种随机数的生成方法。

1.使用PHP内置函数生成随机数

使用PHP的内置函数可以自由的生成随机数,常见的函数有 mt_rand() 和 rand(),下面分别看下这两个函数的语法:

rand()函数语法

rand(min,max)

参数

min,max这两个参数可以省略。

说明

如果没有提供可选参数 min 和 max,rand() 返回 0 到 RAND_MAX 之间的伪随机整数。例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 rand(5, 15)。

某些平台下(例如 Windows)RAND_MAX 只有 32768。如果需要的范围大于 32768,那么指定 min 和 max 参数就可以生成大于 RAND_MAX 的数了,或者考虑用 mt_rand() 来替代它。

实例:

	<?php
	   //生成随机数
	   echo rand();

	   //生成1-100内某个随机数
	   echo rand(1,100);
	?>

mt_rand()函数语法

mt_rand(min,max)

说明

如果没有提供可选参数 min 和 max,mt_rand() 返回 0 到 RAND_MAX 之间的伪随机数。例如想要 5 到 15(包括 5 和 15)之间的随机数,用 mt_rand(5, 15)。

实例:

	<?php
	   echo mt_rand();
	   echo "<br/>";
	   echo mt_rand(100,200);
	?>

输出:
13139999
49

两个函数比较:mt_rand() 比rand() 快四倍 。

2.自定义函数生成指定长度的含数字、字母随机数(串)

	/**
	* 产生随机字符串
	*
	* @param    int        $length  输出长度 
	* @param    string     $chars   可选的 ,默认为 0123456789abcdefghijklmnopqrstuvwxyz

	* @return   string     字符串
	*/

	function random($length, $chars = '0123456789abcdefghijklmnopqrstuvwxyz') {
	    $hash = '';
	    $max = strlen($chars) - 1;

	    for($i = 0; $i < $length; $i++) {
	        $hash .= $chars[mt_rand(0, $max)];
	    }
	    return $hash;
	}

3.生成更复杂的随机字符串,字符包括^、#、%等特殊字符

	function randomkeys($length){
	    $output='';
	    for($a=0;$a<$length; $a++){
	        $output.=chr(mt_rand(33, 126));    
	    }
	    return $output;
	}

	echo randomkeys(20);
/* 类似输出:EGztLufY\Eq/br{y!;>P */

或者,使用下面这种方法生成随机字符串:

	function keygen() {
	  $tempstring =
	  "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO
	  PQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABC
	  DEFGHIJKLMNOPQRSTUVWXYZ!?@#$%&*[]{}();:,<>~+=-_
	  /|\\";

	  for($length = 0; $length < mt_rand(10, 15); $length++) {
	   $temp = str_shuffle($tempstring);
	   $char = mt_rand(0, strlen($temp));
	   $pass .= $temp[$char];
	  }
	  return $pass;
	}

上面的这两种方法,都可以生成复杂的随机字符串,这些复杂的字符串还可以用做密码的使用等特殊用途。

4.生成一个随机的 6 个字符的十六进制字符串

	<?php
	// generate a random number between 0 and 0xffffff
	//生成0到0xffffff的一个随机数
	$rand = mt_rand(0x000000, 0xffffff); 

	// make sure we're not over 0xffffff, which shouldn't happen anyway

	$rand = dechex($rand & 0xffffff); 
	// add zeroes in front of the generated string

	//如果有0确保0在首位
	$rand = str_pad($rand, 6, '0', STR_PAD_LEFT); 
	echo $rand;
	?>

类似输出:

8514d2
3188ae
028f3e

5.在连续的整数区间内,生成指定个数而且互不相同的随机数

	function random_number_array($count, $from, $to){
	   for($i=$from;$i<$to;$i++){
	    $number_array[] = $i;
	   }

	   $random_number_array = array();

	   mt_srand ((double) microtime() * 1000000);

	   for($i=0;$i<$count;$i++){

	      $random_number = mt_rand(0,count($number_array)-1);

	      $key_to_insert_and_delete = array_search($random_number, $number_array);

	      $random_number_array[$i] = $number_array[$key_to_insert_and_delete];

	      array_splice($number_array, $key_to_insert_and_delete, 1);

	   }

	   // Array $random_number_array with $count random Numbers, between $from and $to
	   return $random_number_array;
	}
	print_r(random_number_array(10,1,100));

可能输出:

	Array
	(
	    [0] => 17
	    [1] => 40
	    [2] => 72
	    [3] => 91
	    [4] => 36
	    [5] => 14
	    [6] => 1
	    [7] => 62
	    [8] => 47
	    [9] => 65
	)

6.在一个指定范围内生成随机浮点数

	function random_float ($min,$max) {
	   return ($min+lcg_value()*(abs($max-$min)));
	}
	echo random_float(1,10);

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.