まずは乱数から。
乱数
本当の乱数は、コインを投げるなどの物理現象を利用して生成されます。このタイプの乱数発生器は物理乱数発生器と呼ばれます。技術的に難しいという欠点があります。
しかし、このような物理乱数発生器によって生成された真の乱数は、本当にランダムであり、絶対的な公平性を反映しています。
擬似乱数にはパターンがあり、このパターンだけ周期が長いのですが、それでも予測可能です。その主な理由は、擬似乱数はアルゴリズムを使ってコンピュータでシミュレートされ、このプロセスには物理的なプロセスが関与していないため、真の乱数の性質を持つことは当然不可能だからです。
現在広く使われているアルゴリズムは以下の2つです:
- 線形合同アルゴリズム周期:2^32= 4294967296 ≒ 42億
- メルセンヌ回転アルゴリズム 周期:2^19937-1=無限大
メルセンヌ回転アルゴリズムは、1997年に2人の日本人数学者、松本伸と西村隆によって提案されました。
サハラ砂漠の砂の大きさは10^26、現在観測可能な宇宙の粒子の大きさは10^87です。 メルセンヌ回転アルゴリズムは、現在観測可能な宇宙の粒子よりも何千桁も高い周期の大きさを持っています。
写真は日本の数学者、小平邦彦氏。代数幾何学ときつい複素解析曲面の理論における卓越した業績で知られています。
擬似乱数の性質とは、種が与えられている限り、得られる乱数列が同じであること。
コマンド・プログラミングとストリーミング・プログラミングの比較
Bruce Eckel氏は、5から20までの非繰り返し整数をランダムに出力し、ソートする例を示しています。命令型プログラミングのアプローチを使うと、次のようになります:
Random rand = new Random(47);
SortedSet<Integer> ints = new TreeSet<>();
while (ints.size() < 7) {
int r = rand.nextInt(20);
if (r < 5) {//数字の5を捨てる
continue;
}
ints.add(r);
}
System.out.println(ints);
結果を実行します:
[7, 8, 9, 11, 13, 15, 18]- まず、Randomオブジェクトにシードを与えて、プログラムが再び実行されたときに同じ乱数列を生成するようにします。
- このプログラムでは、rand、ints、rの3つの変数を定義しています。
- 反復の仕組みは明示的に記述します。つまり外部反復です。
- また、if文を使って5未満の結果をフィルタリングしています。
ストリーミング・プログラミングを使うと、コードは次のようになります:
[7, 8, 9, , 18]
結果を実行します:
- 変数を定義する必要はありません。ストリームを使えば、代入や変数を使わずにステートフルなシステムをモデリングできます。
- ストリーミングは、サンプルコードのforEachメソッドのような内部反復を使用します。
- ストリーミングは、プログラムをより簡潔で理解しやすくします。例えば、if文なしで5未満の結果値をフィルタリングすることができます。
全体として、ストリーミングは宣言的なプログラミングのスタイルであり、何を行うかではなく、どのように行うかを宣言します。
なぜストリーミング・プログラミングなのか
プログラミングやデータの流れ方は、コップに水を注ぐと、高いところからどんどんコップに水が流れ込んでくるようなものだからです。そのため、比喩的に「ストリーミング・プログラミング」と呼ばれています。





