!乱数をより速く生成する方法!

WBOY
リリース: 2016-06-23 13:47:05
オリジナル
1051 人が閲覧しました

要件は以下のとおりです。
会員が購入すると注文番号が生成されます。この注文番号は、1 ~ 100,000 などの一定の範囲内のデータである必要があります。

私が現在使用している方法は、rand(1,100000) を使用して乱数を生成し、乱数を取得した後、その数値が既に存在する場合は、ループで再度確認します。
コードは次のとおりです:
rrree

これを実行した後、注文番号がまだ非常に小さい場合は、注文番号を取得するのは簡単ですが、注文番号が 99990 に達している場合は、この時点で次のことが必要です。他の注文番号を生成するには、数分から 1 時間ほどかかる場合があります。

このアプローチはもう機能しません。

解決策を見つけるか、他のアイデアを提供するのを手伝ってください、ありがとう!


ディスカッションに返信 (解決策)

         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);			}		}
ログイン後にコピー

$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


要件は 10,000 ~ 100,000 である必要があります

$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


需要要件は、数値が次の範囲にある場合に入力する必要があります10,000 と 100,000


それをインクリメントするには atomic redis を使用する必要があります


$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


この要求では、数値が 10,000 から 100,000 までである必要があります


次に、Atomic Redis を使用して自動化する必要があります。増加


明確に説明していなかったので、注文番号は 10,000 から 100,000 の間である必要があることを付け加えます。注文番号は増分または減分で生成できません。10,000 から 100,000 の間でランダムである限り、ランダムである必要があります。ランダム処理中に連続した番号が生成された場合、それに対処する必要はありません

と書くことができます。擬似乱数生成器を自分で作ってみましょう

まず、

$_order_id = date('YmdHis') . rand(100000,999999);//这样的订单号应该不会有重复的,又方便,前面还能看出时间来
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
$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)));
ログイン後にコピー
ログイン後にコピー
を観察してください。 $r には0から99999までのランダムに配置された数値が含まれており、各数値は一度だけ出現することがわかります

$n をデータベースに入力された最後の数値とします、 then ($n * $c + $b) % $m はライブラリに存在しなければなりません

ご理解いただけると幸いです


まず既存の注文番号をクエリして配列に入れます。チェックする必要はありません。毎回ライブラリにアクセスします

最初に未使用の注文番号の合計数をクエリし、次に最大の乱数をそれに設定します。必要なだけ制限できます

スペースが十分でない場合は、メンバー ID + タイムスタンプを追加するだけです十分な乱数。それは決して繰り返されません

疑似乱数生成器は自分で書くことができます

まず

Array(    [1] => 100000)
ログイン後にコピー
ログイン後にコピー
$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)));
ログイン後にコピー
ログイン後にコピー
を観察すると、$r には 0 から 99999 までのランダムに配置された数値が含まれており、各数値は 1 回だけ表示されることがわかります

$ n が最後であること 数値を一度にデータベースに入力する場合、 ($n * $c + $b) % $m はデータベースに存在してはなりません

理解していただければ幸いです

なぜそうなるのか説明していただけますか非反復乱数 数学的原理は何ですか? 多くの擬似乱数は自然対数を使用することがわかりました

時間を追加することによって順序数を生成することも可能です

Array(    [1] => 100000)
ログイン後にコピー
ログイン後にコピー
患者のスクリーニング後、b と完全に均一にする c


array_count_values(array_count_values($ In r)),
array_count_values($r) は配列を取得し、各値の出現回数を $r に保存し
再度カウントします
Array
(
[ 1] => 100000
)
これらの 100,000 個の数字は繰り返されません

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


モデレータさん、熱心にご協力いただきありがとうございます

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート