需求是这样的:
会员购物,会生成一个定单号,这个定单号必须是数字,而且是在一定的范围之内的数据,如 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);
谢谢版主的热心帮助

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

禅工作室 13.0.1
功能强大的PHP集成开发环境