いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)サイコロを振るシミュレーション

 Googleスプレッドシートで、サイコロを振った結果をシミュレーションする例についてです。

  • RANDBETWEEN関数やRANDARRAY関数を使って、サイコロを振った結果をシミュレートすることができます。

手順

サイコロを1回振る例

f:id:accs2014:20200928013606p:plain:right:w450

 一般的な正六面体のサイコロを1回だけ振った結果を求める例です。
 画像ではB2セルに式を入力することで「5」という結果が得られています。
 式の内容は次のとおりです。

 B2セル

=RANDBETWEEN(1,6)

 RANDBETWEEN関数は指定した最小値と最大値の間のランダムな整数を生成します。
 よって最小値を1、最大値を6とすればサイコロの代わりとなります。

サイコロを複数回振る例

f:id:accs2014:20200801004329p:plain:right:w450

 正六面体のサイコロを複数回振った結果を求める例です。
 上記のRANDBETWEEN関数を大量にコピーしてもよいのですが、RANDARRAY関数を使うと式を1つにまとめることができます。
 画像ではB2セルに1つの式を入力するだけで、サイコロを10回振った結果を一挙に得ています。

 B2セル

=ARRAYFORMULA(INT(RANDARRAY(10)*6+1))

 RANDARRAY関数の引数として10を与えています。これにより10個の乱数をまとめて取得しています。
 あとは上記の例と同様に、それぞれの乱数に6をかけて1を足して小数を切り捨てて「1から6までの整数となる乱数」を得ています。
 また、さらにこの式をSUM関数で囲んで次のようにすれば、10回振った合計だけを得ることができます。

=SUM(ARRAYFORMULA(INT(RANDARRAY(10)*6+1)))

 なお、公式解説(こちら)によると、RANDARRAY関数は「0以上1以下の乱数」を生成することとされており、これをその通り受け止めるとこの式で「7」が発生する可能性があることになります。ただし確認は極めて困難ですので特に補正はせず、RAND関数の例と同様に扱っています(次の例も同様)。

x面体のサイコロをn回振ってそれぞれの目の回数を集計する例

 上の例を踏まえて、正x面体のサイコロをn回振った結果を求めます。特にnが莫大な場合、すべての結果をセルに表示させても確認が容易でないので、QUERY関数を使ってそれぞれの目が出た回数を集計し、その結果だけを表示させます。
 画像ではC2セルでxを、C3セルでnを設定しています。そしてE2セルの式でそれらのセルを参照し、サイコロを振った結果をシミュレートしています。

f:id:accs2014:20200801004333p:plain:w750

 E2セル

=QUERY(ARRAYFORMULA(INT(RANDARRAY(C3)*C2+1)),"SELECT Col1,COUNT(Col1) GROUP BY Col1 ORDER BY Col1")

 「ARRAYFORMULA(INT(RANDARRAY(C3)*C2+1))」の部分は内容的に上の例と全く同じです。あとはQUERY関数を使って1~xまでの目ごとにグループ化し、それぞれの回数を求めています(ただし1回も発生しなかった目は表示されません)。