0

Webサイトのユーザーごとに完全に乱数を作成し、MySQLデータベースに挿入する必要があります。数値を繰り返すことはできません。特定の範囲が必要なため、MySQLAutoIncrementを使用したくありません。111,111からと言い999,999,999,999ます。現在のところ、これより高くも低くもありません。あなたが疑問に思っていた場合に備えて、私にはその範囲の特定の理由があります。私は私が使用できることを知っていますuniqueMySQLの機能ですが、それは私が重複を挿入するのを防ぐだけです。番号を生成する機能と、その番号が使用されているかどうかを確認する機能の2つを考えていました。使用されていない番号が見つかるまで、ループを続けます。私はそれがどれほど非効率的であり、それらの数字の大部分が取られてからどれくらいの時間がかかるかを知っているので、より良い答えのためにここに来ました。私はすべてアイデアがないので、あなたは私が何をすることを提案しますか。助けてくれてありがとう!

4

3 に答える 3

6

あなたはあなたがただできることを知っています:

ALTER TABLE `mytable` AUTO_INCREMENT=111111

右?

とにかく、まだランダム性に傾倒している場合はSELECT、既存のすべての値に対しておそらく最も効率的であり、それらをPHP配列にロードしてから、rand(111111,999999999999)ではない数値が得られるまでPHPを呼び出しますin_array

補足:PHPは、64ビットバージョンでない限り999,999,999,999を処理できません。これは、その数が32ビットには大きすぎるためです。

于 2012-04-17T01:20:15.193 に答える
2

自動増分番号を1111111に設定するのはどうですか。

ALTER TABLE YourTable AUTO_INCREMENT=1111111;
于 2012-04-17T01:20:39.687 に答える
1

閉区間[111111,999999999999]で任意の値を生成できるようにすると仮定すると、互いに素な整数を見つけるだけで済みます。

999999999999 - 111111 + 1 = 999999888889

これは、かなり大きな因数を持つ合成数{18181、55002469}です。

それでは、最後に選択した整数から新しい疑似乱数整数を生成する、単純で、それほどランダムではない(ただし、ここでは確かに適切な)数値ジェネレーターを作成します。単純なモジュラー計算によってそれを行います。最初にいくつかの数値を選択し、上記の要因に対して互いに素である別の整数を選択します。

N(1) = 111111111111
N(i+1) = mod(N(i)*2803 + 4353454321 , 999999888889)

非常に退屈するまで、サイクリングせずにこのプロセスを繰り返すことができます。

下限を111111にしたいので、使用するときはすべての数値にその値を追加するだけです。この手順により、次のシーケンスが生成されます。

{111111111111, 448832453975, 81861723884, 462790945592, 207518059664, 677539248004, 147076609322, 260135161619, 163292472297, 713204080539, 115613316027, 68514277966, ...}

すべての値に111111を追加して、下限が本当に111111になるようにします。したがって、報告されるシーケンスは次のようになります。

{111111222222, 448832565086, 81861834995, 462791056703, 207518170775, 677539359115, 147076720433, 260135272730, 163292583408, 713204191650, 115613427138, 68514389077, ...} 

良いことは、シーケンスの最後のメンバーを格納し、64ビット整数に収まる数値に対してモジュラー演算を実行することだけです。

于 2012-04-17T12:06:54.083 に答える