調べて分かる道具箱

3Dサイコロをふる

面の数
何個ふるか個
出た目
—

「ふる」を押すと、ここに出ます。

これまでの記録

ふると、どの目が何回出たかがここに増えていきます。

  • 目 10回 —
  • 目 20回 —
  • 目 30回 —
  • 目 40回 —
  • 目 50回 —
  • 目 60回 —

この記録はこの画面の中だけにあります。どこにも送っていませんし、 保存もしていません。ページを閉じたり、読み込み直したりすると消えます。

この立方体の展開図

上のサイコロを開くとこうなります。向かい合う面の和はどれも7です (上と下、左と右、まん中と右はし)。

上5
左4
手前1
右3
奥6
下2

数と、どの面どうしが向かい合うかだけを見てください。

よくある質問

このサイコロは公平ですか?

公平になるように作っています。目はブラウザの暗号用の乱数(crypto.getRandomValues)から決めていて、しかも「あまり」を取るときに出る小さなかたよりを、引き直しで消してあります。ただし公平だと信じてもらう必要はありません。ふった回数と各目の回数を画面に出しているので、100回でも1000回でもふって、ご自分で確かめてください。

6が3回続けて出ました。そろそろ別の目が出ますか?

出やすくはなりません。サイコロは前に何が出たかを覚えていないので、次に6が出る確率はいつでも6分の1のままです。これは「ギャンブラーの誤り」と呼ばれる有名な思い違いです。大数の法則が言っているのは「回数を重ねると割合が6分の1に近づく」ということで、「出ていない目が取り返しに来る」ということではありません。実際、ふった回数を100倍にすると、割合のずれは10分の1に縮む一方で、回数のずれはむしろ10倍に広がります。

乱数のあまりで目を決めると、なぜかたよるのですか?

乱数を1バイト(0から255までの256通り)引いて6で割ると、256は6で割り切れないからです。256 = 6 × 42 + 4 なので、あまりが0から3になる組み合わせだけが43通りあり、4と5は42通りしかありません。つまり目1から目4がわずかに出やすくなります。この道具では252以上が出たら捨てて引き直すので、6つの目がぴったり42通りずつになり、かたよりが消えます。

6面と8面しか選べないのはなぜですか?

転がるところを見てほしいからです。12面や20面も正多面体で実物も売られていますが、面が多いほど1枚が小さくなり、転がっている間に何が起きているのか読み取れなくなります。4面のサイコロは、実物も転がったときに上を向く面がなく(頂点が上に来ます)、手前の面で目を読むこの見せ方と合いません。なお10面ダイスはそもそも正多面体ではありません。ユークリッドの『原論』第13巻が示すとおり、すべての面が同じ正多角形でできた立体は4・6・8・12・20の5種類しかないからです。10面ダイスはたこ形の面を10枚組んだ別の形で、どの面も同じ形にすることで公平さを保っています。

ふった記録はどこかに保存されますか?

保存していません。記録は画面の中だけにあり、どこにも送っていません。ページを閉じたり読み込み直したりすると消えます。途中で消したいときは「記録を消す」を押してください。面の数を変えたときも、目の数が変わって比べられなくなるので記録は消えます。

サイコロを2個ふると、なぜ合計7が出やすいのですか?

組み合わせの数が違うからです。2個の目の出方は全部で36通りありますが、合計が7になる組み合わせは1と6、2と5、3と4、4と3、5と2、6と1の6通りあります。いっぽう合計2になるのは1と1の1通りだけです。だから7は6分の1、2は36分の1で、7のほうが6倍出やすくなります。サイコロそのものは公平でも、足した数は公平になりません。

ボタンを押すとサイコロが転がります。どの目が何回出たかを記録するので、 ふるほど公平さが目に見えてきます。

100回ふると、どの目もおよそ16.7回に近づきます

1回ごとの出目は当てられません。ところが何度もくり返すと、割合は落ち着きます。 6面なら、どの目もおよそ6分の1(16.7パーセント)に近づきます。 これを大数の法則といいます。 ヤコブ・ベルヌーイが『推測法(Ars Conjectandi)』 (1713年)の第4部で証明したものです。

「100回まとめて」を何度か押してみてください。 10回ふっただけのときはでこぼこだった棒が、 1000回、1万回とふるうちにそろっていくのが分かります。

でも「そろそろ6が出るころだ」は間違いです

サイコロは前に何が出たかを覚えていません。 6が3回続いても、次に6が出るのは やはり6分の1です。 出ていない目が「取り返しに来る」ことはありません。これはギャンブラーの誤りと呼ばれる、とても有名な思い違いです。

大数の法則が言っているのは割合のことで、回数のことではありません。 じつは、ふる回数を増やすと回数のずれはむしろ大きくなります。 6面をふったときの「理想からのずれ」の 目安は、次のように動きます。

6面のサイコロで、ふった回数ごとの理想からのずれの目安
ふった回数回数のずれ割合のずれ
100回±3.7回±3.727パーセント
10,000回±37.3回±0.373パーセント
1,000,000回±372.7回±0.037パーセント

回数を100倍にすると、回数のずれは10倍に広がり、割合のずれは10分の1に縮みます。 近づいているのは割合だけです。ここが、大数の法則でいちばん取り違えられるところです。

「乱数のあまり」で目を決めると、1から4がわずかに出やすくなります

ここが、このページでいちばん持ち帰ってほしいところです。 コンピュータで目を決めるとき、いちばん短く書ける方法は 「乱数を1バイト引いて、面の数で割ったあまりを使う」です。これはかたよります。

1バイトの乱数は0から255までの256通り。 これを6で割ると256 = 6 × 42 + 4で、割り切れません。 あまった4個ぶんだけ、 小さいあまりが1通り多く当たります。 全256通りを数えると、目1から目4は43通り、目5と目6は42通り。およそ2.4パーセントの差がつきます。

1回や2回では気づけません。だからこそ、気づかないまま配られてしまいます。 面の数によって、かたより方はこう変わります (この表は、この道具で振れない面数も並べています ── かたより方は面の数だけで決まるので、そちらのほうが見比べやすいからです)。

面の数ごとの、あまりだけで目を決めたときのかたより
面の数多い目少ない目差捨てる値
4面かたよらない64通り64通り0.0パーセント0個
6面43通り42通り2.4パーセント4個
8面かたよらない32通り32通り0.0パーセント0個
10面26通り25通り4.0パーセント6個
12面22通り21通り4.8パーセント4個
20面13通り12通り8.3パーセント16個

4面と8面だけ、差がありません。 理由は256が2を8回かけた数だからです。 2を何回かかけた数(4・8・16・…)でだけ きれいに割り切れて、それ以外では必ずあまりが出ます。面の数が2のべき乗かどうかで、かたよるかどうかが決まります。

252以上が出たら捨てて引き直す ── これで差が消えます

直し方はおどろくほど簡単です。割り切れる範囲だけを使えばいい。6面なら、0から251までの252通りは6で割り切れるので、 あまりを取っても6つの目にぴったり42通りずつ割り当たります。252以上(252・253・254・255)が出たときだけ、その値を捨ててもう一度引きます。 これを棄却(ききゃく)サンプリングといいます。

捨てることになるのは4/256、つまり1.6パーセントだけ。 ほとんどの場合は1回引けば決まります。 上の「出た目」のところに、実際に引いた乱数とその割り算を出しているので、 捨てて引き直したときはそれも見えます。手元の紙で検算してみてください。

持ち帰り: これはサイコロだけの話ではありません。乱数を「%(あまり)」で 小さい範囲に押し込めるときは、いつでも同じことが起こります。 くじ引き、シャッフル、 パスワードの1文字を選ぶとき。あまりを取る前に「割り切れるか」を確かめる── これが、このページのいちばんの持ち帰りです。

Math.random ではなく crypto.getRandomValues を使っています

目を決める乱数は、ブラウザの暗号用の乱数から取っています。 決まりの文には、 こう書かれています。

W3C の Web Cryptography API(新しいタブで開きます)は getRandomValues を 「generates cryptographically strong random values(暗号として強い乱数を作る)」 と定めています。 いっぽう JavaScript の言語仕様(ECMA-262)(新しいタブで開きます) が Math.random について書いているのは 「using an implementation-defined algorithm or strategy (どんなやり方で作るかは実装が決めてよい)」だけです。

つまり Math.random は、どれくらい良い乱数なのかを仕様が何も約束していません。 サイコロを1回ふるには じゅうぶんかもしれませんが、約束されているほうを使わない理由がありません。

正多面体は5種類しかありません ── サイコロの形が限られる理由

サイコロの面の数が好きに選べないのには、理由があります。どの面も同じ形・同じ大きさにできる立体は、たった5種類しかないからです。

これは新しい話ではありません。紀元前3世紀のユークリッド『原論』第13巻の最後に、 こう書かれています ──「no other figure, besides the said five figures, can be constructed which is contained by equilateral and equiangular figures equal to one another」(新しいタブで開きます)(いま挙げた5つのほかに、同じ正多角形だけでできた立体は作れない)。

理由も、その場で書かれています。 立体の角では、集まる角の合計が360度より小さい必要があります。ちょうど360度だと平らになってしまい、 それより大きいと折りたためないからです。

  • 正三角形(60度)は3枚(180度)・4枚(240度)・5枚(300度)まで。 6枚だと360度でぺったんこ。 → 正四面体・正八面体・正二十面体
  • 正方形(90度)は3枚(270度)まで。4枚だと360度。 → 立方体(正六面体)
  • 正五角形(108度)は3枚(324度)まで。4枚だと432度で折れない。 → 正十二面体
  • 正六角形(120度)は3枚でもう360度。どうやっても作れません

だから面の数は4・6・8・12・20の5つだけです。

この道具が転がすのは、そのうち6面と8面の2つです。 12面や20面も正多面体で、実物も売られています。ただ面が多いほど1枚が小さくなり、転がっている間に何が起きているのか 読み取れなくなります。 ここで見てほしいのは転がる様子なので、 面が少なくて動きが分かる2つに絞りました。

よく売られている10面ダイスは、5種類に入っていません(10がこの5つに無い以上、正多面体にはなりようがありません)。 あれはたこ形の面を10枚組んだ別の形で、どの面も同じ形にすることで公平さを保っています。 公平なサイコロが正多面体だけとは限らない、ということです。

ちなみに、向かい合う面の和が7になる並べ方は2通りあります。 回してもぴったり重ならない2種類で、鏡に映した関係です (このことは総当たりで確かめて、単体テストに固定してあります)。 お手元のサイコロと、この画面のサイコロが鏡像かもしれません。 上の展開図と見くらべてみてください。

three.js を使わずに、CSS だけで立方体を作っています

この立方体には3Dのライブラリを1つも使っていません。 正方形の板を6枚置いて、 CSS の transform-style: preserve-3d で立体として並べ、 回しているだけです。追加で読み込むファイルは0バイトです。

よく使われる three.js は、圧縮したあとでも86,590バイトあります (実際に測った値です)。立方体を1個転がすために読み込むには大きすぎます。 スマートフォンの電波が弱いところでは、その差がそのまま待ち時間になります。

出目は先に決めています。 転がる動きから目を読み取っているのではなく、 乱数で目を決めてから、その面が手前に来る向きへ回しているだけです。 こうしておくと、出た目が正しいかどうかを計算で検算できます (物理の計算から目を読む作りにすると、そこが試験できなくなります)。

正八面体も、同じ作り方で組んでいます

8面のサイコロも板を並べて回しているだけです。 立方体との違いは板の枚数と形と角度だけで、正三角形の板をclip-path で切って使っています。こちらも追加で読み込むファイルは0バイトです。

面の向きは計算で出しています。ただし向きを合わせるだけでは立体になりません── 板が面の中でてんでな角度を向いていると、辺どうしが噛み合わずに隙間だらけの塊になります。 ところが、それでも画面では「なんとなく立体っぽいもの」に見えてしまいます。 そこで板の四隅がどこへ行くかを計算して、本当の頂点と重なるか・辺の長さがそろっているか・ どの辺もちょうど2枚の面が共有しているかを試験で確かめています。 辺の数はオイラーの多面体定理(頂点 − 辺 + 面 = 2)で検算しました。

出どころ: 乱数の決まりは W3C Web Cryptography API(新しいタブで開きます) と ECMA-262(新しいタブで開きます)の原文、正多面体が5種類であることは ユークリッド『原論』第13巻 命題18 の注(新しいタブで開きます)(クラーク大学 D. E. Joyce による英訳)、 大数の法則はヤコブ・ベルヌーイ 『推測法(Ars Conjectandi)』(1713年)第4部です。 かたよりの通り数(43通りと42通り)は、256通りを全部数えた結果で、単体テストに固定してあります。