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. js高级知识---词法分析和AO 链

    转载自https://www.cnblogs.com/OceanHeaven/p/4957704.html 上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代 ...

  2. ModuleNotFoundError: No module named '_sqlite3' -- python2.7 问题

    ModuleNotFoundError: No module named '_sqlite3' 运行python 工程出现上面这个问题,以为python安装中缺少这个依赖, 注python 2.7 首 ...

  3. 一文掌握 Linux 性能分析之内存篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 前面我们已经学 ...

  4. Filebeat工作原理

    在这篇文章中,您可以了解Filebeat的关键构建模块以及它们如何一起工作.了解这些概念将有助于您针对特定用例对Filebeat进行配置做出明智的决定.Filebeat由两个主要组件组成: prosp ...

  5. 响应式bootstrap - demo

    参考资料: bootstrap:http://www.bootcss.com/ 汤姆大叔的博客: <深入理解Bootstrap>http://item.jd.com/11462962.ht ...

  6. php 常用的自定义函数

    1. 发送 SMS 在开发 Web 或者移动应用的时候,经常会遇到需要发送 SMS 给用户,或者因为登录原因,或者是为了发送信息.下面的 PHP 代码就实现了发送 SMS 的功能. 为了使用任何的语言 ...

  7. Cookie 判断页面是否为第一次打开 包括刷新

    $.cookie = function(e, t, n) { if(arguments.length > 1 && (!/Object/.test(Object.prototyp ...

  8. (转)Vue种key的作用

    https://blog.csdn.net/qq_41861679/article/details/80659278 https://cn.vuejs.org/v2/api/#key 其实不只是vue ...

  9. Java_Character类

      Character类用于对单字符进行操作. 常用的方法: System.out.println(Character.isDigit('1')); // true 判断是否是一个数字字符 Syste ...

  10. swiper2 swiper-slide 之间的间距调整

    1.在css中调整间距(我的这个是一行显示三个) swiper-slide-active 可以对这个类进行操作 这个类是显示在页面上的第一个元素 2.设置js //热门新闻 swiper var ne ...