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. Tupper自我指涉公式生成器

  2. 移动端click事件300ms延迟

    移动端click 事件延迟300ms 一般情况下,如果没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟.也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应, ...

  3. 在vue中引入scss

    先npm安装stylus和stylus-loader  (我安装后,报错提示缺少stylus,所以第一步安装stylus,如果没有提示可省略第一步) 1.到 package.json ----- de ...

  4. Trie树的二三事QWQ

    写在前面 Trie,又称字典树,是一种用于实现字符串快速检索的多叉树结构.Trie的每个结点都拥有若干字符指针,若在插入或检索字符串时扫描到一个字符c,就沿着当前节点的c这个字符指针,走向该指针指向的 ...

  5. Database学习 - mysql 视图/触发器/函数

  6. Pycharm新建模板默认添加作者时间等信息

    在pycharm使用过程中,对于每次新建文件的shebang行和关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2. ...

  7. C++设计模式——中介者模式

    前言 我们都知道,这个国际政治是一门很深的学问,不玩政治的人是搞不懂的.那么多的国家,国家之间的关系又及其复杂:就好比现在,美国和中国有经济利益关系,美国又和日本有盟友关系,朝鲜又和中国有说不清道不明 ...

  8. .NET垃圾回收机制(一)

    垃圾收集器(GarbageCollection)是组成.Net平台一个很重要的部分,.NET垃圾回收机制降低了编程复杂度,使程序员不必分散精力去处理析构.不妨碍设计师进行系统抽象.减少了由于内存运用不 ...

  9. R语言仪表盘

    单个仪表盘 导入包及代码: library(ggplot2) library("showtext") library(Cairo) library("Rmisc" ...

  10. RDay2-Problem 1 A

    题目描述 初始给你一个排列p[i],你可以执行以下操作任意多次. 选择一个i,交换p[i]和p[i+1]的值(其实就是交换排列当中两个相邻的元素). 我们现在希望对于任意的i满足p[i]不等于i,求最 ...