一、随机数相关知识
在PHP中,我们经常需要使用随机数来生成验证码、密码、抽奖等等。PHP中的随机数,是通过rand()、mt_rand()、array_rand()等函数实现的。
rand()函数是基于C语言的标准库实现的,但其效率比较低,而且很容易因为随机数种子的问题而导致不同环境下产生相同的随机数。
mt_rand()函数是基于更高效的Mersenne Twister算法实现的,因此它的效率比rand()高,而且可靠性也更高。
array_rand()函数则是用于从数组中随机取出一个或多个元素。
二、PHP7.0中的新特性
在PHP7.0版本中,引入了基于内部保存的状态的CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,加密安全伪随机数生成器),它的效率比mt_rand()更高,同时可以为我们提供更加安全可靠的随机数。
PHP7.0中提供了random_int()和random_bytes()两个函数来实现CSPRNG。
1. random_int()函数
random_int()函数用于生成指定范围内的随机整数,使用时需要指定两个参数:最小值和最大值,函数会自动在这个范围内生成一个随机整数。随机数的生成是加密安全的,并且可以保证返回的随机数不会发生小数位数不同的情况(即不会出现精度损失问题)。
示例代码:
```
$random = random_int(1, 10); //生成1-10范围内的随机整数
echo $random; //输出随机数
```
2. random_bytes()函数
random_bytes()函数用于生成指定长度的随机字节串(是一种长度固定的二进制数据),也是基于CSPRNG算法实现的。使用时需要传入一个整数,表示需要生成的字节数。
示例代码:
```
$random = random_bytes(16); //生成16字节的随机字节串
echo bin2hex($random); //将字节串转换为16进制字符串输出
```
在上面的示例代码中,我们使用了PHP内置的bin2hex()函数,将随机字节串转换成16进制形式输出。
三、按比例生成随机数
在实际开发中,我们可能需要根据某种比例来生成随机数,比如在抽奖活动中,不同奖品的中奖概率是不同的,那么如何根据这个比例生成随机数呢?
我们可以使用PHP7.0中的random_int()函数来实现。具体思路是:将有奖品的数组中的元素按照中奖概率转化为一个范围,然后生成一个指定范围内的随机整数,最后根据这个随机数落在哪个范围内来确定中奖结果。
示例代码:
```
//模拟一个奖品数组,并且每个奖品中奖概率不同
$prizes = array(
'一等奖' => 5,
'二等奖' => 10,
'三等奖' => 20,
'参与奖' => 65
);
$total = array_sum($prizes); //计算所有奖品中奖概率总和
$rand = random_int(1, $total); //生成1-总中奖概率范围内的随机整数
$cur = 0;
foreach($prizes as $key => $value) {
$cur += $value; //累加中奖概率
if($rand <= $cur) { //当前随机数落在当前奖品范围内
echo $key; //输出中奖奖品
break;
}
}
```
在上面的示例代码中,我们将每个奖品的中奖概率相加得到总中奖概率,然后生成一个1到总中奖概率范围内的随机整数rand。接着,我们遍历奖品数组,不断累加当前奖品的中奖概率,如果当前随机数rand落在当前奖品的范围内,则输出中奖奖品并退出循环。
四、总结
本文介绍了PHP中常用的随机数生成方式,比较了rand()、mt_rand()和CSPRNG算法,并详细介绍了PHP7.0中新增的random_int()和random_bytes()函数,同时还讲述了如何根据比例生成随机数。希望本文能对初学者有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复