第7章 乱数
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
第6章では、Lambda式を使ってプロンプトを変更できるようにget_pricesを改良し、この汎用版をinput.cppに実装した。本章では「ランダム」な数値を用いたget_pricesのオーバーロードを記述し、架空の株式を売買できる簡易取引アプリを構築する。価格をランダム生成するため、プログラム実行時に数値を入力する必要がなくなる。
株価のように振る舞う価格を生成できれば、取引戦略を試してどれだけ損(あるいは儲け)が出るかも確認できる。 「Lambdaキャプチャで楽しむと儲かる」では、上昇局面の最初の値動きで利益を発見した。 ここではブラック・ショールズ方程式を簡略化したモデルに基づき、価格を生成する方法を示す。 これは不確実性を表す確率変数(確率変数とも呼ばれる)を用いる。 多くの金融機関は、金利上昇など様々な状況下で何が起こるかを調査するためにモデルを使用している。
注
ほとんどのプログラミング言語には、一見任意に見える数字を生成するな方法がある。これにより、次にどの数字が出るかを推測することはほぼ不可能だ。これらの数字は数学的関数から生成されるため、しばしば擬似乱数と呼ばれる。その詳細を知っていれば、次に何が来るかを計算できる。 したがって、これらの数字は真のランダムではないが、ゲームなどには十分近い。真のランダム性が必要な場合は、ソフトウェアを超えたものを探す必要がある。ソフトウェアやコードは決定論的だが、乱数はそうではない。したがって、この章で「ランダム」という言葉を使う場合、擬似乱数を意味する。
第8章ではファイルから価格を読み込む方法を学ぶので、価格を取得する手段がいくつか増える。本書の残りの部分では、より大規模な取引アプリを構築する方法を学ぶことになる。
乱数生成
まずはな乱数を生成するところから始めよう。新しいmain.cppファイルを作成する。C++の乱数を使った実験のための関数を書くことになる。出力用に<IOSTREAM>、乱数機能用に<RANDOM>をインクルードする:
#include<iostream>#include<random>voidrandom_experiment(){}intmain(){random_experiment();}
の乱数生成には様々な方法がある。数値はint型や double型といった数値型を持つ。randomライブラリはテンプレートを使用するため、必要な型を指定できる。型と共に、分布(数値がどのように広がるか)も指定する必要がある。最も単純な分布は一様分布で、各要素が等確率で現れる(公平なサイコロやコイン投げのように)。
サイコロが不公平だったり、コインが何らかの方法で操作されていたりする場合、分布はバイアスがかかる。図7-1は、公平なサイコロと不公平なサイコロを120回振った結果を比較している。公平なサイコロの理論上の期待値(各数字が20回ずつ出る)も併せて示されている。右端の最も高い棒グラフから分かるように、バイアスのかかったサイコロは6が出る確率がはるかに高い。
まずは一様分布から始めよう。これはstd::uniform_int_distributionと呼ばれる。サイコロを振るには、1から6までの整数が必要だ。では、おなじみの<>記号で型を指定し、下限と上限を指定できる。例えばこうだ:
std:: ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access