0〜1の数字をランダムに生成する Random[ ] 関数を用いて, サイコロを作る

Random[]:  0〜1の数字をランダムに生成する関数

<< Statistics`DataManipulation`                 
<< Graphics`MultipleListPlot`                     
<< Statistics`DescriptiveStatistics`     
<< Graphics`Graphics`

x = Random[]   \( (*\ 乱数を1つ生成する\ *) \)
y = 
        If[x < 1/6, 1, 
          If[x < 1/3, 2, 
            If[x < 1/2, 3, 
              If[x < 2/3, 4, If[x < 5/6, 5, 6]]]]];
Print[y]

ndata = 100000;    
data = 
        Table[If[(x = Random[]) < 1/6, 1, 
            If[x < 1/3, 2, 
              If[x < 1/2, 3, 
                If[x < 2/3, 4, 
                  If[x < 5/6, 5, 6]]]]], {ndata}];
freq = BinCounts[data, { .5, 6.5, 1}]               
midpoints = Table[i, {i, 1, 6}];            
BarChart[
      Transpose[{freq, midpoints}]]

応用編  サイコロの目の出方の乱雑さ

a = {};
Do[
          If[data[[i]] == 1, a = Append[a, i]], {i, 1, ndata}];     
b = {};
Do[
        b = Append[b, a[[i + 1]] - a[[i]]], {i, 1, Length[a] - 1}]    
midpoints = Table[i, {i, 1, Max[b]}];             
freq = BinCounts[b, { .5, Max[b] +  .5, 1}] /Length[a];              
fig1 = 
      MultipleListPlot[Transpose[{midpoints, freq}], 
        SymbolShape -> PlotSymbol[Box]];  
    fig2 = Plot[
        1/6 (5/6)^(i - 1), {i, 1, 
          Max[b]}];
Show[fig1, fig2]

Print[ "11\:56de\:4ee5\:4e0a\:9023\:7d9a\
\:3057\:30661\:306e\:76ee\:306e\:3067\:306a\:3044\:78ba\:7387 (\:4e71\:6570\
\:306b\:3088\:308b\:8a08\:7b97) = ", 
          N[Sum[freq[[i]], {i, 11, Max[b]}]]];
Print[ "11\:56de\:4ee5\:4e0a\:9023\:7d9a\:3057\:30661\:306e\
\:76ee\:306e\:3067\:306a\:3044\:78ba\:7387 (\:7406\:8ad6\:5024       ) = ", 
        N[Sum[1/6 (5/6)^(i - 1), {i, 11, Infinity}]]   ]

応用編  半径1の円の面積を乱数を用いて求める

0-1の乱数x,yにより点(x, y)を生成しすると, この点はxy座標の0<x<1, 0<y<1の部分に均等に分布するであろう. そのような点のうち, 原点との距離が1以下となるものの割合を求めてみよう.

ndata = 10000;
data = 
        Table[If[Random[]^2 + Random[]^2 < 1, 1, 
            0], {ndata}];
Print[ "\:4e71\:6570\:306b\:3088\:308a\:6c42\:3081\:305f \
π \:306e\:5024 = ",  N[Mean[data]]*4]

乱数で生成した各点をグラフに描かせる場合には次のプログラムを使う. 点の数ndataを大きくしすぎるとプログラムが動かなくなるので注意!

ndata = 10000;     
in = {}; 
    out = {};
Do[
        If[(x = Random[])^2 + (y = Random[])^2 < 1, 
          in = Append[in, {x, y}], out = Append[out, {x, y}]], {ndata}]    (* \(x, \ 
          y\ 座標を乱数で生成し, \ 原点までの距離が1以下のx, 
          y\ ペアはinに入れ, \ それ以外はoutに入れていく\) *)
fig1 = 
        ListPlot[in, PlotStyle -> Hue[1], 
          AspectRatio -> Automatic]; 
      fig2 = ListPlot[out, AspectRatio -> Automatic]; 
      Show[fig1, fig2];(* \(原点までの距離が1以下のx, 
          y\ ペアによる点は赤, \ それ以外は黒で図に示す\) *)
Print[ "\:4e71\:6570\:306b\:3088\:308a\:6c42\:3081\:305f \
π \:306e\:5024 = ",  N[Length[in]/ndata*4]]