chokudaiのブログ

chokudai(高橋直大)のブログです

さいころを使った1〜Nまでの完全な乱数の作り方 2≦N≦20

人生ゲームとかやる時用に 手軽になるように作ってみました。振る回数の期待値は全て3以下です。
振る必要のある回数の期待値も併記しています。これより減らせる場合はコメントによろしくお願いします。回数はおそらくΣ[k=1..∞](6^(k-1)%n)/6^(k-1)になるだろう、という予測が経ちましたが、全ての明記はちょっと複雑になるので止めておきます。n=13,14,16,17,19,20が最善でないです。

N=2 (1回)

方法1

さいころを1回振り、偶数の場合1、奇数の場合2

方法2

3以下なら1、4以上なら2

N=3 (1回)

方法1

さいころを1回振り、3で割った余りに1を足す

方法2

1〜2が1、3〜4が2、5〜6が3とする

N=4 (1.5回)

5以上が出たら振りなおす

別解法
  • N=2を2回利用する(2回)

追記 omeometoさん提供(1.333333回)

1〜4が出たらそのまま確定
5〜6が出たら、これにN=2の結果を組み合わせて判定

N=5 (1.2回)

6が出たら振りなおす

N=6 (1回)

普通に振る

N=7 (2.0571428回)

サイコロを2回振り、出た目の和を7で割った余りに1を足す。ただし、1回目が1、2回目が6の場合のみ振り直す。

参考

  • 1・・・(2,5) (3,4) (4,3) (5,2) (6,1) の5通り (1,6)は振り直し
  • 2・・・(2,6) (3,5) (4,4) (5,3) (6,2) の5通り
  • 3・・・(1,1) (3,6) (4,5) (5,4) (6,3) の5通り
  • 4・・・(1,2) (2,1) (4,6) (5,5) (6,4) の5通り
  • 5・・・(1,3) (2,2) (3,1) (5,6) (6,5) の5通り
  • 6・・・(1,4) (2,3) (3,2) (4,1) (6,6) の5通り
  • 7・・・(1,5) (2,4) (3,3) (4,2) (5,1) の5通り

となり、均等な割合で発生する。ぶっちゃけ1〜36に変換して、36切り捨てでmod7でも良いですw

別解法
  • N=8を別解を利用して8以上振り直し(2.857142回)
  • N=9を利用して8以上振り直し(2.571428回)


N=8(2.25回)

N=9を利用して、9の場合振りなおす

別解法
  • N=2とN=4を利用し算出(2.5回)

追記 xhlさん提供(2.111111回)

2回振った目がa,bだった時に(a-1)*6+(b-1)の値=nが0〜31の場合n%8+1, 32〜35の場合1回振りなおしてその値をcとすると(n-32)*2+c%2+1 とすると2.111111回

N=9(2回)

A=1〜3の乱数(1回)
B=1〜3の乱数(1回)
A*3+B-3で、1〜9の乱数となる

N=10(2.2回)

A=1〜5の乱数(1.2回)
B=1〜2の乱数(1回)
A*2+B-2で、1〜10の乱数となる

N=11(2.181818回)

N=12の方法で乱数を生成 12の時のみやり直し

N=12(2回)

A=1〜6の乱数(1回)
B=1〜2の乱数(1回)
A*2+B-2で、1〜12の乱数となる

N=13(2.53846回)

N=15を利用し、14以上が出たら振り直し

N=14(2.357142回)

N=15を利用し、15が出たら振り直し

別解法
  • N=2とN=7を利用して算出(3.0571428回)


N=15(2.2回)

A=1〜5の乱数(1.2回)
B=1〜3の乱数(1回)
A*3+B-3で、1〜15の乱数となる

N=16(2.25回)

N=18を利用し、17以上で振り直し

別解法
  • N=4を2回利用する(3回)


N=17(2.117647回)

N=18を利用し、18の時振り直し

N=18(2回)

A=1〜6の乱数(1回)
B=1〜3の乱数(1回)
A*3+B-3で、1〜18の乱数となる

N=19(2.842105回)

N=20を利用し、20以上の場合振り直し

N=20(2.7回)

A=1〜5の乱数(1.2回)
B=1〜4の乱数(1.5回)
A*4+B-4で、1〜20の乱数となる