クライアントなどに提出するサンプルデータを作成する際、いちいち数値を入力するのが面倒ということがありますよね。
そんなときに便利なのが、RAND関数です。
名前の通りRANDOM(ランダム)な数字を出してくれる関数なので、わざわざ手入力しなくても自動で乱数が入力されていき、時短にもつながります。
通常は、0より大きく1未満の数で、小数点以下まで出すことができ、さらには整数や指定した範囲内での乱数も対応可能です。
今回の記事を参考に、ぜひマスターしてくださいね。
目次
乱数とは?
そもそも乱数とは、サイコロの出目のように規則性がなく、予測不能な数値のことです。
何度も数値を生成した時に、すでに分かっている値の列から次に現れる値を、予測できないような数値の列を乱数列と呼び、その中の個々の値を乱数と呼びます。
この概念はプログラミングでよく用いられ、乱数を生成する組み込みの関数やメソッドなどが用意されています。
多くのプログラミング言語では、0以上1未満の浮動小数点数が得られるようになっているため、用途に応じて必要な形式に計算・加工して利用します。
また、コンピュータはその性質上、ソフトウェアによって完全な乱数を生成することができません。
そのため、統計的に乱数と同じ性質を持つような擬似乱数を計算によって生成しているのです。
乱数が必要な場面とは
乱数という概念は、プログラミング言語だけのものではなく、日常生活でも使われます。
代表例が、パスワードの生成です。
私たちの生活ではネットショッピングからメールアプリなど、インターネット上でパスワードを頻繁に使います。パスワードでアカウントや情報を管理する際、大切なのは他人に不正使用されない文字列や数値を用いることです。
この安全なパスワードづくりの基本に乱数が活躍します。
よくある危険なパスワードの作り方は「誕生日を使ったパスワード」や「他のログインパスワードと同じものを使い回すケース」です。
とくにカバンを忘れたり、財布を落としたりした際に、免許証やIDカードなど生年月日の載ったカードも一緒に落とすことになるため、パスワードが容易に暴かれてしまいます。
ほかにも、ショッピングサイトなどから氏名と生年月日が流出してしまい、その情報と組み合わせてパスワードが解読される危険性も。
また、同じパスワードを使い回していると、容易に他のツールに使っているパスワードも突破されてしまいます。
安全なネット生活を送るためには、自分と縁のない文字列・数字を使ったパスワード設定や、使い回しをしないことが重要です。
乱数表の作り方
ここからはエクセルの関数を使って、乱数を生成する方法をご紹介していきます。
エクセルのRAND関数で乱数を生成する方法
RAND関数の構文はRAND「=RAND()」で、引数はありません。
RAND関数の使い方は、任意のセルにRAND関数を入力します。【Enter】キーを押せば乱数を作成することができるので、非常にシンプルです。
このRAND関数はINT関数とRAND関数、もしくはROUND関数とRAND関数を組み合わせた数式を使うと、乱数を100までの整数にすることができます。
乱数を100までの整数にする方法について、INT関数と組み合わせる場合と、ROUND関数と組み合わせる場合については、この記事の後半でご紹介していきます。
エクセルのRANDBETWEEN関数で乱数を生成する方法
続いては、RANDBETWEEN関数についてみていきましょう。
RANDBETWEEN関数とは、指定された範囲内の整数の乱数を返す関数です。
また、ワークシートが再計算されるたびに、新しい整数の乱数が返されますので、常に最新の乱数が表されることになります。
構文は「=RANDBETWEEN(最小値, 最大値)」と書き、各引数は必ず指定します。
RAND関数とINT関数を組み合わせて使う方法
それでは、前の章でふれたRAND関数とINT関数を組み合わた使い方を解説していきます。
INTとは「整数型」という意味です。
エクセルにおいてINT関数とは、「指定した数値の小数点以下を切り捨て、元の数字を超えない最大の整数を返す」関数です。
たとえば、5.7にINT関数を適用すると5を値として返します。構文は「=INT(数値)」です。
それでは、数を返したい任意のセルを選択し=INT(RAND()*100)
と入力してみましょう。
この「=INT(RAND()*100)」は、「RAND関数で作成した乱数に100をかけて、小数点以下の数字を切り捨てる」という意味です。
Enterを押すと、INT関数とRAND関数を組み合わせて、乱数を100までの整数に返すことができます。
RAND関数とROUND関数を組み合わせて使う方法
次に、RAND関数とROUND関数と組み合わせをみましょう。
ROUND関数は、数値を四捨五入して指定された桁数にします。
たとえばセル A1 が 23.7825 で、その数値を小数点以下第2位に四捨五入するには、次の数式をセルに入力します。
=ROUND(A1, 2) |
この関数の結果は23.78と表示されます。
構文は次の通りです。
ROUND(数値, 桁数) |
ROUND関数の構成要素の引数は、それぞれ必ず指定します。
このROUND関数とRAND関数を組み合わせることで、乱数を100までの整数にすることが可能です。
それでは、乱数を返したい任意のセルを選択し=ROUND(RAND()*100,0)
と入力します。
この「=ROUND(RAND()*100,0)」は、「RAND関数で作成した乱数に100をかけて、小数点以下を四捨五入する」という意味です。
Enterを押すと、ROUND関数とRAND関数を組み合わせて乱数を100までの整数にできます。
あわせて読みたい|擬似乱数とは?
プログラミングの世界の中でいわゆる乱数として扱われることが多いのは「擬似乱数」です。疑似関数とは正確には乱数ではありません。
まずはその点について解説していきます。
というのも、コンピューターの世界では外部からの入力に頼らず、計算だけで真乱数を再現することができないのでこの疑似関数を用いるのです。
では、本当の乱数、いわゆる真乱数は次のような性質を満たす必要があります。
無作為性(randomness)予測不可能性(unpredictability)再現不可能性(irreproducibility) |
1つ目の無作為性とは、統計的な偏りがなく規則性もないという性質のことです。
よく疑似乱数の性質を評価する時に、「N次元で均等分布する」という表現が使われることがありますが、擬似乱数は規則性がないのではなく、規則が複雑なために一見すると相関性がほとんど見えまぜん。
つまり、N次元で均等分布するというのは、少なくともN次元空間に乱数をプロットしても規則性は見えないが、逆に言うと、より高次元にプロットすれば規則性が見えてくるということでもあります。
そのため、真乱数であればNをどれだけ大きくしても均等分布します。
2つ目の予測不可能性とは、過去に生成された乱数の数列から次に生成する乱数の値を予測できない、という性質をもっています。
ここでいう予測とは、100%確実である必要はありません。
0以上N未満の整数を生成する乱数であれば、1/Nの的中率があるはずですが、十分な試行を繰り返した時に的中率が1/Nからずれるようであれば、予測可能であるとみなせます。
3つ目の再現不可能性とは、恣意的に特定の数列を出力させることができないということです。たとえば、真乱数を生成するはずのデバイスが内部のバグにより、電源を入れ直した直後僅かに0を出力する可能性が高い、というケースであっても再現不可能性を満たしていないことになります。
冒頭でお伝えしたとおり、コンピュータの計算だけで真乱数を生成することはできません。
ですから、真乱数を作るには何かしらアルゴリズムを要さない複雑性をもつ必要があります。したがって、真乱数を高速に生成するのは難しく、少なくとも一般的なコンピューターにとってはコストの高い処理ということになります。
そして、実際のところ真乱数の性質を全て満たしていなくても、目的によっては問題がないので、擬似乱数を使うのが一般的です。
ゲームにおける乱数とは?
ゲームであれば、多くが何らかの乱数を利用しています。
たとえば、パズルゲームやシューティングゲームなど、固定の面をクリアする形式のものであれば不要ですが、カードゲームやサイコロなどをテーマにしたゲームでは必須要素です。
とはいえ、ゲームの場合は科学的な数値計算シミュレーションほどの周期や無作為性が求められたり、暗号化に使うほどの安全性が求められたりはしません。
通信を伴わないゲーム
シングルプレイのロールプレイングゲーム(RPG)など、基本的に通信を必要としないゲームでは、人間が違和感を覚えない程度の疑似乱数で十分です。
実際のところ、昔のゲームはリソースやレジスタの大きさの問題もあり、周期が短かったり偏りが大きい疑似乱数が使われていることも少なくありません。
とはいえ、わざわざ質の悪い疑似乱数を選ぶ必要もありません。
ゲームの正解では、C言語のRAND関数の実装では、線形合同法が利用されています。
線形合同法とは、乗算と加算を使って実装されたアルゴリズムのこと。
一番最初に提唱されたものを見ると下位1ビットで0と1が交互に登場するという偏りがあるため、質の良くない疑似乱数の例としてあげられることもありますが、最近のC言語ライブラリはさすがにそのくらいは対策されています。特にスタンドアロンで他に影響を与えることのない環境でゲームに使う用途なら、問題は大きくなかったりもします。また、線形合同法は32bitや64bitなど小さい内部状態で実装可能です。
他の有力なアルゴリズムだと、xorshift系の疑似乱数があります。
名前の通りxor演算とshift演算を組み合わせたアルゴリズムで、これはどちらも高速に計算可能なので、線形合同法より速いとされています。
内部状態の大きさも、バリエーションによりますが32bitから1024bit程度と小さく、線形合同法からこちらに置き換えられることも多いです。
たとえば、ブラウザのMath.random実装はxorshift派生のxoroshiroアルゴリズムに置き換えられています。
通信を伴うゲーム
クライアントのサーバーで通信を行うゲームの場合、一つのサーバーに多数のクライアントが接続し、サーバーが全ての乱数を生成します。
クライアントの接続タイミングは基本的に予測不可能です。
ですから十分な数のクライアントが同時接続している場合、そのリクエストはエントロピーと見なすことが可能です。
つまり、1回のリクエストあたりの乱数生成数が十分に少なければ、周期の短い乱数を使ってもクライアント側には十分な乱雑さがあるように解釈できます。そのため、線形合同法やxorshiftも場合によっては利用可能です。
大抵のネットゲームでは暗黙的にサーバーは信頼される物と考えられますが、場合によってはその信頼性に疑義が出されることがあります。特に、出現率の低いレアアイテムが含まれるガチャの仕組みや、秘匿情報になっている麻雀やトランプゲームの対人戦、といった分野ではサーバーが不正をしていないことを積極的に証明することが必要不可欠です。
まとめ
いかがでしたでしょうか。
今回の記事ではエクセルの乱数についてご紹介してきました。
コンピューターは無作為な動作を作ることはできないので、アルゴリズムに従って乱数を決めています。そんなときに、乱数を生成することができるエクセルのRAND関数が便利です。また、RANDBETWEEN関数を使うことで乱数の範囲を指定したり、発生した乱数を固定することも可能です。
エクセルで表やリストを用いたサンプル作成などに適当な数字を入力する際に非常に便利です。ほかにも、エクセルを必要としない、パスワード作成やランダムな文字列が必要なときには、Web上にさまざまな乱数生成ツールもあるので、目的に応じて使いやすい方を選んで活用するとよいでしょう。