PHP算法学习(4) 随机算法
svn地址:svn://gitee.com/zxadmin/live_z
<?php /*
* 随机数算法
* 伪随机数 根据分布概率
*/ final class Random {
/*
* 生成一个随机的字符串
* $codeLength 越大重复概率越低
* 随机种子使用时间和位运算作为最基础,一微秒做到百万分之一或者千万分之一的重复概率
* uniqid()函数测试 for php7.2写入10万次往数据库无一重复,函数源码有待研究,目前猜测是根据时间微妙有一部分外加随机一部分数据
*/ // protected static $last = 0;
protected static $microsecond = 1; //返回长度并不一定 写入10万次往数据库无一重复 也和uniqid()达到同样效果
public static function BasicsRandom() {
$code = '';
$time = self::getTime();
//十进制转16进制 base_convert 支持的浮点数有大小限制
$prefix = base_convert($time['time'], 10, 32);
//截取后面微秒
$microsecond = $time['right'];
self::$microsecond += 10;
$four = (int) $microsecond + self::$microsecond; $suffix = mb_substr((string) $four, 0, 5);
$code = $prefix . base_convert($suffix, 10, 32);
return $code;
} public static function getRandomNumber() {
$code = '';
$time = self::getTime();
$prefix = $time['time'];
//截取后面微秒
$microsecond = $time['right'];
self::$microsecond += 10;
$four = (int) $microsecond + self::$microsecond; $suffix = mb_substr((string) $four, 0, 5);
$code = $prefix . $suffix;
return $code;
} /*
* 利用系统的组件实现机器随机,因为是现在很多是虚拟机,模拟真实机器,但是随机程度依然很大
*
* dev/urandom生成的速度比/dev/random快。如果不能立即生成随机串,/dev/random会一直阻塞,有时会非常耗费CPU;
* /dev/urandom则会根据其他值立即生成一个随机串,不会阻塞。/dev/urandom生成的随机值没有/dev/random随机。大多数情况下,我们选用/dev/urandom
* 没有时间验证真假,linux采用的是/dev/urandom windows采用是
* https://www.cnblogs.com/zx-admin/p/10282021.html DLL下载 和安装
*
*/ public static function machineRandom($length = 16) {
/*
* win 返回字符串长度,根据 $length 变化
* linux 返回字符串长度,根据 $length 变化
* 需要自己根据实际情况测试
*/
try {
$pr_bits = '';
//防止大小写问题
if (mb_substr(strtolower(PHP_OS), 0, 3) == 'win') {
$CAPI_Util = new COM('CAPICOM.Utilities.1');
$pr_bits = $CAPI_Util->GetRandom($length, 0);
//返回是26位的字符串 tOONrQXC1YF7erMcER1jww==
if (!empty($pr_bits)) {
return $pr_bits;
} else {
throw new \Exception('return data is empty');
}
} else {
$fp = @fopen('/dev/urandom', 'rb');
if ($fp !== FALSE) {
$pr_bits = @fread($fp, $length);
@fclose($fp);
}
//返回是32位的字符串 e717c3ee007e669f84f0a2426d65d368
if (!empty(bin2hex($pr_bits))) {
return bin2hex($pr_bits);
} else {
throw new \Exception('return data is empty');
}
}
} catch (Exception $e) {
throw new \Exception($e->getMessage());
}
} public static function getTime() {
/*
* 测试 1989年 小数点后是五位数,但是近几年是四位数
* 统一 乘以 五位数的0
*/
// return (double) microtime(true) * 100000; $time = microtime(true);
$array = explode('.', $time);
// p($array);
if (empty($array['1'])) {
$return['right'] = str_pad('', 5, '0', STR_PAD_RIGHT);
} else {
$return['right'] = str_pad($array['1'], 5, '0', STR_PAD_RIGHT);
}
$return['sec'] = $array['0'];
$return['time'] = $array['0'] . $return['right']; return $return;
} public static function getNumber() {
$Number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
return $Number;
} public static function getUperString() {
$String = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
return $String;
} public static function getLowerString() {
$String = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
return $String;
} public static function getString() {
$String = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!',
'@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_',
'[', ']', '{', '}', '<', '>', '~', '`', '+', '=', ',',
'.', ';', ':', '/', '?', '|');
return $String;
} public static function convert2To16($mybit) {
$_32hexa = "";
$index = -4;
while (abs($index) <= 240) {
$a = substr($mybit, $index, 4);
$index = $index - 4;
$_32hexa = base_convert($a, 2, 16) . $_32hexa;
}
return $_32hexa;
} public static function convert2To32($mybit) {
$_32hexa = "";
$index = -5;
while (abs($index) <= 240) { //多少位 ,默认240位
$a = substr($mybit, $index, 4);
$index = $index - 5;
$_32hexa = base_convert($a, 2, 32) . $_32hexa;
}
return $_32hexa;
} }
PHP算法学习(4) 随机算法的更多相关文章
- 【算法学习】老算法,新姿势,STL——Heap
“堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...
- python的random模块及加权随机算法的python实现
random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. ...
- Javascript经典算法学习1:产生随机数组的辅助类
辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySort ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- 强化学习(十七) 基于模型的强化学习与Dyna算法框架
在前面我们讨论了基于价值的强化学习(Value Based RL)和基于策略的强化学习模型(Policy Based RL),本篇我们讨论最后一种强化学习流派,基于模型的强化学习(Model Base ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- 吴恩达课后作业学习2-week2-优化算法
参考:https://blog.csdn.net/u013733326/article/details/79907419 希望大家直接到上面的网址去查看代码,下面是本人的笔记 我们需要做以下几件事: ...
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- TensorFlow入门学习(让机器/算法帮助我们作出选择)
catalogue . 个人理解 . 基本使用 . MNIST(multiclass classification)入门 . 深入MNIST . 卷积神经网络:CIFAR- 数据集分类 . 单词的向量 ...
随机推荐
- smartgit
1.同步最新分支 2.smartgit ctrl+2 可以看到本地新增加的文件
- 爬虫时遇到的' 编码错误gbk ' 的解决方案
# 每次请求一次,然后写文件,这样可以规避多次请求触发反爬虫 r = requests.get('https://www.pearvideo.com/video_1522192') html = r. ...
- ul li 实现层级列表显示
实现效果如下: 实现要求具体如下: 1.标题有序号 上图标记1 2.标题下面的子集标题要有一定的缩进,且子集标题也有一定的序号,上图标记 2 3.如果子集标题内容过长,换行的时,开始的位置不能超过对应 ...
- 【原创】大叔问题定位分享(12)Spark保存文本类型文件(text、csv、json等)到hdfs时为什么是压缩格式的
问题重现 rdd.repartition(1).write.csv(outPath) 写文件之后发现文件是压缩过的 write时首先会获取hadoopConf,然后从中获取是否压缩以及压缩格式 org ...
- 原生javascript实现阻止浏览器默认行为与阻止事件冒泡
不同的浏览器之间存在兼容问题,在IE与标准浏览器之间存在很大的差异,所以在实现阻止浏览器默认行为和阻止事件冒泡就要考虑要它们之间的不同 /** * 取消冒泡 * @param {事件} e */ fu ...
- spring boot 启动
启动spring boot java -jar tuia-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod 查找进程 ps aux|grep tuia- ...
- 解决 for xml path encode 的问题
select stuff( (select ', <' + name + '>' from sys.databases where database_id > 4 order by ...
- JSONP ---------跨域
什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: 首 ...
- Kali Linux常用服务配置教程DHCP服务原理
Kali Linux常用服务配置教程DHCP服务原理 动态主机配置协议(Dynamic Host Configuration Protocol,简称DHCP)是一个局域网的网络协议,基于UDP协议工作 ...
- webpack配置antd的按需加载
安装babel-plugin-import插件.下面方法二选一,都可以实现antd的按需加载. 一.配置webpack.config.js文件 { test: /.jsx?$/, exclude: / ...