PHP range関数を使って階乗と重複組み合わせを計算
2018/01/07
「乱数発生器」
http://s-giken.info/random/random.php
乱数発生器という Webアプリを作りました。
「乱数発生器」は見た目は非常にシンプルで、というか、実際中身の処理も非常に簡単なものなのですが(処理そのものは数行ですから)、処理を実行する前に細かく入力チェックを行っています。
その中で、任意の文字列から重複せずに生成できる文字列の件数と、生成の要求の件数を比較する、というチェックがあります。
具体的には、「ab」の 2文字から重複せずに生成できる文字列は「aa」「ab」「ba」「bb」の 4種類しかありません。
ですが、「ab」の文字列から 6件のランダム文字列が欲しいという条件入力があった場合は生成できませんので、それは入力エラーとして処理する必要があるわけです。
その際、指定の文字列から重複組み合わせの計算を行い、何件まで生成が可能なのか、を計算する必要があるわけですが、久しぶりに重複組み合わせの考え方を思い出す必要があり、ちょっと大変でした。
また、重複組み合わせを計算するには、階乗を計算する必要があり、これをプログラムで記述する必要が出てきます。
階乗については、下記のサイトに練習問題として提示されており、回答として for文でぐるぐる回す方法が提示されています。
http://torasukenote.blog120.fc2.com/blog-entry-49.html
range関数で乱数を生成する
私は、こちらのやり方を参考にしつつ rangeという関数を使って処理を作ってみました。
for文が複数出てくると、プログラムを組んでいるときはよくても、後から読むときが大変なのでそれを軽減することを目的にこのような処理を作ってみました。
また、rangeという関数は、非常に便利な関数で、for分を使わずにもいろいろな処理を簡潔に書けるのではないか、と思いました。
上記の URLの練習問題と同じことを下記の処理で再現できます。
for ( $i = 1; $i <= 10; $i++ ) {
$kumiawase = 1;
$num = range ( $i, 1 );
foreach ( $num as $val ) {
$kumiawase *= $val;
}
echo $i . "! = " . $kumiawase . "
";
}
また、実際のプログラムに組み込んでいる重複組み合わせの数を取得する関数は下記のようになります。
// 重複組み合わせの計算(n H r)
function r_combination ( $mojisuu, $keta ) {
$num1 = range ( ( $mojisuu + $keta - 1 ), 1 );
$num2 = range ( $keta, 1 );
$num3 = range ( ( $mojisuu -1 ), 1 );
$kumiawase = 1;
foreach ( $num1 as $val ) {
$kumiawase *= $val;
}
foreach ( $num2 as $val ) {
$kumiawase /= $val;
}
foreach ( $num3 as $val ) {
$kumiawase /= $val;
}
return $kumiawase;
}
ちなみに、ここでは関数にしていますが、実際のプログラムでは関数にはしていません!
なぜなら、これまで十数年プログラムを組んできましたが、重複組み合わせが必要になったのはこれが初めてだからですね。
ここで関数を作っても、もう今後も使う機会はないでしょう。という判断ですね。
乱数発生器(パスワード生成サービス) Ver.2 登場!
乱数発生器(パスワード生成サービス)ですが、2017年06月17日に、処理内容を見直し、高速化してバージョン 2としてリニューアル新登場!
乱数生成の処理と、重複チェックの処理を見直して、数十万件の乱数生成が数秒でできてしまいます!
新しいバージョンも是非とも試して見てください。
乱数発生器(パスワード生成サービス) Ver.2
https://s-giken.info/random/random.php
また、解説記事を下記に書いていますので、あわせて参考にしてください。
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
また、JavaScriptを利用して、入力エリアの横に「パスワードを生成する」ボタンを追加する機能について下記に記事を書いています。あわせてご覧ください。
JavaScriptで「パスワードの生成」ボタンを追加する処理サンプル
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム
PHPのcURLを使用してカオナビAPIのアクセスに必要なtoken、シートの情報を取得するサンプルプログラムを作成。cURLの処理は関数化しているため他のAPIでも流用できる。
-
-
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説
路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない
PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。
-
-
SEO対策用タイトル、ディスクリプションの文字数カウントツール
SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。
-
-
PHPで特定の日間の日付を for、strtotimeで表示する
ある特定の間の日付の情報を for文、strtotimeを使って作成し、その解説をしています。
-
-
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。
-
-
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。
-
-
cURLを利用する際の注意点「
&」があるURLは「”」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
-
QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。