質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

7762閲覧

重複のない6桁の数字をIDとして採番するアルゴリズムを教えて下さい。

aoyahiro777

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/02/29 04:49

・カウントアップを利用しその連番数をスクランブルすることで予測の困難な6桁のユニーク値を生成させたい
・アクセスかなにかリクエストのたびにユニークナンバーを発生させたい

下記URLのアルゴリズムでいけるかと思ったのですが
桁数の調節がうまくできません。
どなたかアドバイスお願い致します。

http://q.hatena.ne.jp/1377468971
http://cs.hatenablog.jp/entry/2013/06/19/135527

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

http://cs.hatenablog.jp/entry/2013/06/19/135527 の中の人です。

  • かけ算が桁あふれしないように64ビット整数を使う。
  • かけ算したらすぐに % 1000000 する。
  • ビットの上下を入れ替える計算は、10進桁の上限を入れ替えるように書くのでもだいたいOK。

これでいけると思います。
奇数の組はもう用意できましたか?

投稿2016/02/29 05:10

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aoyahiro777

2016/02/29 05:47

お返事頂きありがとうございます。 恐縮ですが数学部分のロジックがきちんと理解できず応用も理解できません。 http://q.hatena.ne.jp/1377468971 のPHPコードに数字を色々といれてみた所、 例えば 1を入れた時に9桁になったんですが(948451296) これは 桁あふれの影響なのでしょうか? 64ビット整数を使うことで回避できるのでしょうか? 重ねて質問してすみませんがよろしくお願いします。
yuba

2016/02/29 08:44

はてなの方で回答したPHPのコードは、31ビットで意図的に桁あふれさせています。 7FFFFFFF と論理積を取っているところですね。 今回は、代わりに1000000で剰余を取ります。
aoyahiro777

2016/03/01 00:44

ありがとうございます! 参考にした記事かいてる方に答えてもらえてうれしいです! 答えを参考に勉強しながら週末に実装してみようと思います!
yuba

2016/03/01 05:01

// 奇数その1の乗算 $v *= 654321; $v %= 1000000; // 桁上下逆転 $v = floor($v / 1000) + (($v % 1000) * 1000); // 奇数その2(奇数その1の逆数)の乗算 $v *= 81; $v %= 1000000; こんな感じです。
inugadaisuki

2016/10/23 03:00

こちらの記事を参考にさせていただいているのですが、わからない部分があり、ご質問させていただきました。 「奇数その2(奇数その1の逆数)」で利用している、「81」という数字ですが、 これはどこから出てきた数字なのでしょうか。 よろしくお願いいたします。
yuba

2016/10/23 03:16

拡張ユークリッドの互除法という手法で求まる、654321の逆数です(10000000を法とした逆数)。
inugadaisuki

2016/10/23 04:02

ご回答ありがとうございます。理解できました。 参考にさせていただきます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問