Home  >  Article  >  Backend Development  >  !怎么更快速的生成一个随机数

!怎么更快速的生成一个随机数

WBOY
WBOYOriginal
2016-06-13 12:08:391197browse

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

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

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


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

这种方法行不通了。

请朋友们帮想想办法,或提供下其它的思路,谢谢了!
------解决思路----------------------
可以自己写一个伪随机数发生器
先观察
$m = 100000;<br />$c = 101;<br />$b = 81;<br />$n = 0;<br />for($i=0; $i<100000; $i++) {<br />  $n = ($n * $c + $b) % $m;<br />  $r[] = $n;<br />}<br />print_r(array_count_values(array_count_values($r)));<br />
Array<br />(<br />    [1] => 100000<br />)<br />
可知 $r 中保有 0 - 99999 随机排列的数字,且每个数字只会出现一次

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

希望你能理解

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn