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) 随机算法的更多相关文章

  1. 【算法学习】老算法,新姿势,STL——Heap

    “堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值. 这都是老套路了,具体的内部实现我也就不谈了. 我一般来说,都是用queue库中的priority_queu ...

  2. python的random模块及加权随机算法的python实现

    random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. ...

  3. Javascript经典算法学习1:产生随机数组的辅助类

    辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySort ...

  4. BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】

    3680: 吊打XXX Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 3192  Solved: 1198[Sub ...

  5. 强化学习(十七) 基于模型的强化学习与Dyna算法框架

    在前面我们讨论了基于价值的强化学习(Value Based RL)和基于策略的强化学习模型(Policy Based RL),本篇我们讨论最后一种强化学习流派,基于模型的强化学习(Model Base ...

  6. 二次剩余Cipolla算法学习笔记

    对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...

  7. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  8. 吴恩达课后作业学习2-week2-优化算法

    参考:https://blog.csdn.net/u013733326/article/details/79907419 希望大家直接到上面的网址去查看代码,下面是本人的笔记 我们需要做以下几件事:  ...

  9. 集成学习值Adaboost算法原理和代码小结(转载)

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...

  10. TensorFlow入门学习(让机器/算法帮助我们作出选择)

    catalogue . 个人理解 . 基本使用 . MNIST(multiclass classification)入门 . 深入MNIST . 卷积神经网络:CIFAR- 数据集分类 . 单词的向量 ...

随机推荐

  1. Vue-cli 模拟数据库

    vue-cli2.x 版本开发: 新版在build目录下的webpack.dev.conf.js配置本地数据访问: 1,在const portfinder = require(‘portfinder’ ...

  2. Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. CREATE TABLE [dbo].[Order ...

  3. linux 乌班图 xshell链接不上服务器

    输入  ps -e |grep ssh ,如果没有任何反应则是没有安装 命令 sudo apt-get install openssh-server 然后出现是否同意-Y,同意进行自动下载 如果提示  ...

  4. JS高级

    一.函数高级 1.函数回调 函数回调的本质:在一个函数中,满足特定条件下,调用另一个函数 // 回调的函数 function callback(data) {} // 逻辑函数 function fu ...

  5. 小程序 wx.request

    wx.request({ url: 'https://hanwslh5.qcloud.la/weapp/HelloWorld', 对于 GET 方法的数据,会将数据转换成 query string(e ...

  6. MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法 (转)

    解决方法: 解决办法也有两种, 第一种是在创建子程序(存储过程.函数.触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个, 例如: CREATE DEFI ...

  7. [转] vue&webpack多页面配置

    前言 最近由于项目需求,选择使用vue框架,webpack打包直接使用的vue-cli,因为需要多页面而vue-cli只有单页面,所以就决定修改vue-cli的配置文件来满足开发需求. html-we ...

  8. Java运行原理、三大体系、jdk构成

    一.java运行原理: 二.Java分为三个体系: JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java ...

  9. 利用NSE脚本检测域传送和证书透明度滥用

    nslookup -type=NS <domain> <server> nmap -p 53 --script dns-zone-transfer --script-args ...

  10. asp.net core的DI框架思考以及服务实例的获取方式总结

    转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/ 整个asp.net core管道从WebHostBuilder到WebHost到后续请求的类中, ...