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- 数据集分类 . 单词的向量 ...
随机推荐
- SQL join 连接时 条件加在 on后面和 where 的区别
task 是用户任务表,manageuser是用户表,以left join 为参考: 此时主表是task,三条sql语句:注意区别.第一句无筛选条件,第二句筛选条件在on后面,第三句sql的筛选语句放 ...
- Flask开发微电影网站(十)
1.后台管理之角色管理 1.1 角色管理之定义角色表单 在app的admin目录的forms.py文件中,定义角色表单 # 角色表单 class RoleForm(FlaskForm): name = ...
- js在数组arr中随机获取count数量的元素
// 在数组arr中随机获取count数量的元素; const getRandomArrayElements = (arr, num) => { // 新建一个数组,将传入的数组复制过来,用于运 ...
- UVA1513 Movie collection
传送门 题意 KI先生有收集大量小电影的习惯, 他把他的珍藏理成一大摞.无论何时他想观看这一些电影的一部,他从这一摞电影中找出这一部电影,小心地将其拿出,以确保这一摞电影不会倒塌. 自从那一摞电影变得 ...
- Git一些简单但非常重要并常用的操作命令
1.将本地与github进行关联配置 生成公钥 ssh-keygen -t rsa -C "jiasheng.mei@hpe.com" 将公钥拷贝到github中 在公钥同文件夹( ...
- Java Web环境搭建
——————————JavaWeb环境搭建 先下载JDK, Tomcat 7.0 安装JDK后,配置环境变量,此处可参考博客: https://www.cnblogs.com/smyhvae/p/37 ...
- codeforces 493 div1 e
题解: 和这件zhcs的那题有点像 第一种做法是考虑i,i+1之间的贡献 这样子就是矩形加减然后求矩形最小值个数 另一种做法是我们从左向右维护mx-nx-r+l 跟之前那题一样我们知道这个的最小值为0 ...
- 加载Assetbundle需要注意的地方
WWW:异步实现,手机上不能用于同步代码,需要监测其完成状态.不用www.dispose. CreateFromFile:阻塞,但是移动平台上面的路径格式有点坑,没时间看,不用. 以下两个方式需要先使 ...
- iOS开发常用第三库
字典转模型 1.(MJExtension) https://github.com/CoderMJLee/MJExtension 2.(YYModel) https://github.com/ibire ...
- BZOJ4503 两个串 多项式 FFT
题目传送门 - BZOJ4503 题意概括 给定两个字符串S和T,回答T在S中出现了几次,在哪些位置出现.注意T中可能有?字符,可以匹配任何字符. 题解 首先,假装你已经知道了这是一道$FFT$题. ...