Excel ワークシート関数
=round(rand()*(y-x)+x,0)
これでxからyの間で乱数を作れる。
例えば、23~37までの乱数を作りたいのなら「 =round(rand()*14+23 」となる。
rand()は0から1未満の数字になる。なのでrand()*14は0から14未満。そこに23を足す。
つまり23から37未満。これをround関数で四捨五入すれば、23~37までの乱数が作れる。
Excel vbaの関数
=int(rnd*(y-x+1)+x)
これでxからyの間で乱数を作れる。
上の例と同様に23~37までの乱数を作りたいのなら「 =int(rnd*15+23) 」となる。
で、ここで使われるintは「小数点以下を切り捨てる」と言うとちょっとおかしいのかな。
「整数部分を取り出す」とか「小数点部分を取り除く」の方が良いのか。
なので、rnd*15で0から15未満の数を作り、23を足すと、23から38未満の乱数ができる。
これをintで整数部分を取り出してやれば、23~37の乱数が出来上がり。
さて、vbaではround関数を使わずにint関数を使っているところが多いけど、なんでなんだろ。
vbaのround関数は確かに、ワークシート関数のroundとは挙動が異なる。
いや、挙動をしっかり把握していれば、「 =round(rnd*(y-x)+x) 」でも良いと思うよ。
というか、普通にこっちでも問題ないのでは?
ただ、vba関数のroundをちゃんと使う場面はなかなかないと思うし、正確に使ってる人はあまりいない。
vbaのround関数は「銀行型丸め処理」になってるから。
だから、roundではなくintを使っているところが多いのかも。
vbaのround関数は簡単にってしまえば、「0.5」とか「3.5」とか「4.5」のような「x.5」となっている時、
四捨五入するかどうかは結果が偶数になるかどうかで判断される。
四捨五入の結果が偶数なら切り上げるけど、奇数なら切り捨てて偶数になるようにする。
「0.5」→「0」、「3.5」→「4」、「4.5」→「4」といったようにね。
ここで、次の数の合計は?
「0.5」「1.5」「2.5」「3.5」「4.5」「5.5」「6.5」「7.5」「8.5」「9.5」
はい、50です。
では、これを四捨五入してから合計してみましょう。
「1」「2」「3」「4」「5」「6」「7」「8」「9」「10」
はい、55になります。
続いて、銀行型丸め処理による四捨五入をしてから合計してみましょう。
「0」「2」「2」「4」「4」「6」「6」「8」「8」「10」
はい、50になります。
ね、なんか、単純に四捨五入するよりも、元の数を合計した値に近くなる。というかこの場合同じになる。
いくつかx.5な値を選んでワークシート関数的な四捨五入=算術型丸め処理と銀行型のそれとを比べると、
銀行型の方が、元の数の合計に近くなる傾向にあることがわかる。
まぁ、そんな特性を必要とする人が、Excelのvbaユーザーに、割合としてそれほど多いとは思えないけど。
それでも、そんな違いがあるから、みんなintで処理してるのかもしれないね。
ついでに、vbaのround関数で
round(1.05,1) とした場合、結果は「1.0」
round(1.15,1) とした場合、結果は「1.2」
となる。
別に「x.5」である必要があるわけではなく、四捨五入をするための比較検討をする数値が「5」であるか
そこがポイント。
かりに「5」ではなく、さらに小数点以下が続いていて「5000001」だったら、
つまり round(1.05000001,1) だったら、この結果は「1.1」になる。
ややこしいですね。
でも、四捨五入という処理はわりと日常的に行われているだけに、
vbaでの round は銀行型だということを覚えておいてそんはないでしょう。
また、どうしてもvbaでワークシート関数のroundを使いたければ、
WorksheetFunction.Round(xxx.x,y)
とでもしてください。
詳しくは http://support.microsoft.com/kb/225330/ja といったMSのサイトで。
さて、ついでなのでPHPではランダムな値をどう求めるか。
rand( int $min , int $max )
まんま、ですな。
rand(23,37)
これで23~37の乱数が出ます。
さらについでで、FileMakerでのランダム。
Random * (y – x) + x でOK。
全レコードからランダムにあるひとつのレコードを選ぶ、といったような場合にはこんな感じ。
Random * Get ( 対象レコード数 ) + 1
ぶっちゃけ、Excelのワークシート関数も使うしvbaも使うし、PHPもFileMakerも使うのに、ちょっとした適当などうでも良い程度のランダムな値を作るのに、こんなにも作法があるとはねぇ・・・