!如何更快速的生成一个随机数!

php中文网
发布: 2016-06-23 13:47:05
原创
1312人浏览过

需求是这样的:
会员购物,会生成一个定单号,这个定单号必须是数字,而且是在一定的范围之内的数据,如 1 到 10万。

我现在用的方法是 用  rand(1,100000),生成一个随机数,得到这个随机数后,再去数据库里查,如果已经存在这个数了,就循环再查。
代码如下:

         set_time_limit(0);		$test = M('test');		$_run = true;		$_order_id = rand(0, 100000);		while ($_run) {			$orderInfo = $test->where("val = ".$_order_id)->find();			if(empty($orderInfo)){				$_run = false;				return $_order_id;			}else{				$_order_id = rand(0, 100000);			}		}
登录后复制


这样做了,在定单号还很少的时候,很轻松的就取得了定单号,可假如当定单号已经达到了99990
这个时间,要生成其它的定单号就要很久了,几分钟甚至一个小时都有可能。

这种方法行不通了。

请朋友们帮想想办法,或提供下其它的思路,谢谢了!


回复讨论(解决方案)

$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
登录后复制
登录后复制
登录后复制
登录后复制

$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
登录后复制
登录后复制
登录后复制
登录后复制



需求要求,非要在1-10万之间的数


$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
登录后复制
登录后复制
登录后复制
登录后复制



需求要求,非要在1-10万之间的数

那你还是用原子性的redis自增吧



$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
登录后复制
登录后复制
登录后复制
登录后复制



需求要求,非要在1-10万之间的数

那你还是用原子性的redis自增吧

我没有描述清楚,补充下吧,定单号要在1-10万之间。  定单号不能 递增或递减的生成,一定要随机的,只要在1-10万之间随机,如果随机的过程中产生连号不用处理

可以自己写一个伪随机数发生器
先观察

$m = 100000;$c = 101;$b = 81;$n = 0;for($i=0; $i<100000; $i++) {  $n = ($n * $c + $b) % $m;  $r[] = $n;}print_r(array_count_values(array_count_values($r)));
登录后复制
登录后复制
Array(    [1] => 100000)
登录后复制
登录后复制
可知 $r 中保有 0 - 99999 随机排列的数字,且每个数字只会出现一次

令 $n  为最后一次入库的号码,则 ($n * $c + $b) % $m 一定就不在库中

希望你能理解

先把已有订单号查询出来放数组,没必要每次查库

先查询没有使用的订单号总量,然后随机数最大值就设它,随到多少,你就limit多少

会员ID+时间戳,位置不够在补上足够的随机数就可以。永远也不会重复

可以自己写一个伪随机数发生器
先观察

$m = 100000;$c = 101;$b = 81;$n = 0;for($i=0; $i<100000; $i++) {  $n = ($n * $c + $b) % $m;  $r[] = $n;}print_r(array_count_values(array_count_values($r)));
登录后复制
登录后复制
Array(    [1] => 100000)
登录后复制
登录后复制
可知 $r 中保有 0 - 99999 随机排列的数字,且每个数字只会出现一次

令 $n  为最后一次入库的号码,则 ($n * $c + $b) % $m 一定就不在库中

希望你能理解


能解释下为何是不重复的随机数吗,数学原理是什么啊,我找到不少伪随机数都是要用自然对数的

加时间生成订单号也是可以的

线性同余法  线性同余方法是目前应用广泛的伪随机数生成算法,其基本思想是通过对前一个数进行线性运算并取模从而得到下一个数。即:a(i+1)=(a(i)*b+c)mod(m)其中b称为乘数,c称为增量,m称为模数,它们均为常数。乘数、增量和模数的选取可以多种多样,只要保证产生的随机数有较好的均匀性和随机性即可。线性同余法的最大周期是m,但一般情况下会小于m。要使周期达到最大,应该满足以下条件:(1) c和m互质;(2) m的所有质因子的积能整除b-1;(3) 若m是4的倍数,则b-1也是;(4) b,c,a(0)(初值,一般即种子)都比m小;(5) b,c是正整数。
登录后复制
经过耐心的筛选,可以找到使绝对均匀的b和c

array_count_values(array_count_values($r)) 中
array_count_values($r) 得到一个数组,保存有$r中每个值出现的次数
再次统计得
Array
(
    [1] => 100000
)
可知这十万个数是不重复的

$_order_id = date('YmdHis') . rand(1000,9999);

谢谢版主的热心帮助

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号