!怎么更快速的生成一个随机数
程序员文章站
2022-06-04 14:54:12
...
求助!如何更快速的生成一个随机数!
需求是这样的:
会员购物,会生成一个定单号,这个定单号必须是数字,而且是在一定的范围之内的数据,如 1 到 10万。
我现在用的方法是 用 rand(1,100000),生成一个随机数,得到这个随机数后,再去数据库里查,如果已经存在这个数了,就循环再查。
代码如下:
这样做了,在定单号还很少的时候,很轻松的就取得了定单号,可假如当定单号已经达到了99990
这个时间,要生成其它的定单号就要很久了,几分钟甚至一个小时都有可能。
这种方法行不通了。
请朋友们帮想想办法,或提供下其它的思路,谢谢了!
------解决思路----------------------
可以自己写一个伪随机数发生器
先观察
令 $n 为最后一次入库的号码,则 ($n * $c + $b) % $m 一定就不在库中
希望你能理解
需求是这样的:
会员购物,会生成一个定单号,这个定单号必须是数字,而且是在一定的范围之内的数据,如 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
这个时间,要生成其它的定单号就要很久了,几分钟甚至一个小时都有可能。
这种方法行不通了。
请朋友们帮想想办法,或提供下其它的思路,谢谢了!
------解决思路----------------------
可以自己写一个伪随机数发生器
先观察
$m = 100000;
$c = 101;
$b = 81;
$n = 0;
for($i=0; $i $n = ($n * $c + $b) % $m;
$r[] = $n;
}
print_r(array_count_values(array_count_values($r)));
Array可知 $r 中保有 0 - 99999 随机排列的数字,且每个数字只会出现一次
(
[1] => 100000
)
令 $n 为最后一次入库的号码,则 ($n * $c + $b) % $m 一定就不在库中
希望你能理解
相关文章
相关视频
上一篇: LNMP环境+Laravel快速搭建
下一篇: 多条件,怎么做缓存