6 返信 最新の回答 日時: Apr 24, 2014 5:38 AM ユーザー:Nu-nrg

    ある桁数以下のランダムなユニークな数字

    Nu-nrg

      タイトル

      ある桁数以下のランダムなユニークな数字

      フォーラムに投稿

           単になんとか番号みたいな、増分の順序ではない適当なユニークな数字を作成したいのですが、
           以前教えてもらった5桁以下の計算式の意味が分からなくなってしまいました。
           これは計算値の自動化で、

      1 + Round ( Random * ( 99999 - 1 ) ; 0 )

           入力値の制限は、常時、データ入力時にユーザーによる上書きを許可しない、ユニークな値、という設定でフィールドに格納しております。

      変な質問で恐縮ですが、この計算式はどういう意図なんでしょうか?

      私が考えるに、
           randomは
      0から1までの範囲の乱数を返すので(1以下しかない)、
           5桁最大整数の99999に、randomの値が1のときに、6桁になってしまうので、
           予め1を引いておいて、最後に1を足す、ということでしょうか。
      切り捨て処理をすれば、1を引いて1を足す処理は必要じゃないんじゃないかと思ってみたり。

      もっとスマート方法があればアドバイスいただけないでしょうか。

        • 1. Re: ある桁数以下のランダムなユニークな数字
          sago350@未来Switch

               私は

               Int ( Random * 99999 ) + 0

               で発生させてます。上のだと0〜99999

          • 2. Re: ある桁数以下のランダムなユニークな数字
            sago350@未来Switch

                 ユニークな値なんですが、作り方としては3つ考えられます。

                   
            1.           値を発生させる度にチェックする方法(手法は色いろあるかと)
            2.      
            3.           予めユニークな値のリストを作っておく(多めに作って重複検索かけて削除すれば生成できる、フリーソフト使う手も)
            4.      
            5.           UUID使う(確実だが、長い)

                 で、テクニック的に優しくて確実な方法としては2.なんじゃないかと思います。
                 1.は重複しない値を生成するのに、C/S環境だと苦労した経験がありますので。(回線が細い所があると重複する場合がある)

            • 3. Re: ある桁数以下のランダムなユニークな数字
              Nu-nrg
                   

                        Int ( Random * 99999 ) + 0

                   最後に0を足すのは何故でしょうか?

                   また、
                   私は0はまずいので、+1しないとまずいですね。
                   で6桁じゃまずいので、やっぱ-1で、intでよいかもですね。
              • 4. Re: ある桁数以下のランダムなユニークな数字
                Shin

                     Random は、0以上1未満の数字を返しますので、

                     Int ( Random * 99999 ) + 1

                     にしておくと、1以上99999以下の整数が返ります。

                     ユニークにするには、重複を禁止するような制限をかけておいても良いですが、エラー処理が必要になります。

                     別テーブルに、1から99999までの数字を設定したレコードを作っておいて、

                     Int ( Random * Get ( レコード総数 ) ) + 1 番目のレコードの内容を取得し、そのレコードを削除していく、という手順が確実かも。

                     ただ、重複するレコードは滅多に出ませんが。

                • 5. Re: ある桁数以下のランダムなユニークな数字
                  Nu-nrg
                       
                            Random は、0以上1未満の数字を返しますので、
                       
                             
                       
                            Int ( Random * 99999 ) + 1
                       
                             
                       
                            にしておくと、1以上99999以下の整数が返ります。

                       なるほど、Rondomは小数点以下20桁まで発生するのですね。
                       99,999*0.99999999999999999999=0.99998.999だから+1で最大99,999ですか。
                       なるほど。

                       ユニークにするのって、結構めんどうなんですね。
                       重複するレコードは滅多に出ないということで、フィールド制限だけでいこうと思います!
                       ありがとうございました。

                  • 6. Re: ある桁数以下のランダムなユニークな数字
                    Nu-nrg

                         コマンド+Nで新規レコード連打作成したら、350件くらい重複現れました。
                         微妙な感じです。
                         よくよく考えると番号増えるほど重複の可能性が増えるんですよね。
                         やっぱユニークにする何か枠組みが必要ですね。