組み合わせの爆発をシミュレーションでモデリングして確率を推定するプログラム、パスワードを例に |
パスワード生成プログラムを例にして、同一のパスワードが出る確率を推定するプログラムを作ってみました。
同一文字列を選別する際にgrep()を使うと11と1134、23111は同じ(部分一致)と判定されます。
この解決にはsubset()を使うと良いみたいです。実行例は以下の通りです。
a <- c(11, 23, 24, 2411, 11789, 11)
grep(11, a) #一致する要素番号が出力されます。引数は最初がパターン、二番目が対象オブジェクトです。
subset(a, a == 11) #一致する要素が出力されます。引数は最初が対象オブジェクト、二番目が条件です。
ついでにwhich()も確認します。
which(a ==11) #11 と同一の要素の番号を出力します。
前回はfor構文を使って一文字ずつ抽出しましたが、今回はsample()で抽出回数xを指定してxヶのパスワード文字列をつくります。
文字数xからなるパスワードを作る関数です。前回と違って最初に一つのオブジェクトに使用する文字(アルファベット大文字小文字、そして0から9)をまとめて入れ、そこからサンプリングします。
pw3 <- function(x){ #xはパスワード文字列の長さです。
次にパスワードをたくさん自動生成してライブラリーをつくる関数です。
pwlibrary3 <- function(x,y){ #yは生成するパスワードの数です。
自動生成したパスワードのライブラリーの中に重複するものが存在するかどうか調べる関数です。
check3 <- function(x, y){ #xはパスワード文字列の長さ、yは生成するパスワードの数です。
check3を繰り返してモンテカルロシミュレーションを行います。xは文字列の長さ、yはつくり出す文字列の数、zはシミュレーションの繰り返し数。
sim3 <- function(x, y, z){
sim3(2, 1000, 10)#二文字パスワードを1000個作成して重複無し(全てユニーク)、同じものが二回、おなじものが三回でるそれぞれ確率です。
sim3(3, 1000, 10)三文字パスワードを1000個作成して重複無し(全てユニーク)、同じものが二回、おなじものが三回でるそれぞれの確率。
sim3(4, 1000, 10)四文字パスワードを1000個作成して重複無し(全てユニーク)、同じものが二回、おなじものが三回でるそそれぞれ確率です。