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の練習問題と同じことを下記の処理で再現できます。
|
1 2 3 4 5 6 7 8 |
for ( $i = 1; $i <= 10; $i++ ) { $kumiawase = 1; $num = range ( $i, 1 ); foreach ( $num as $val ) { $kumiawase *= $val; } echo $i . "! = " . $kumiawase . "<br />"; } |
また、実際のプログラムに組み込んでいる重複組み合わせの数を取得する関数は下記のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 重複組み合わせの計算(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で「パスワードの生成」ボタンを追加する処理サンプル
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
フォルダを指定してファイルのパーミッションを変更するプログラム
フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。
-
-
ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合
テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。
-
-
パーミッション(属性)一括変更ツール・WordPress最適化済
WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。
-
-
QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。
-
-
SEO対策用タイトル、ディスクリプションの文字数カウントツール
SEO対策に使える文字数カウントツールで文字数の条件の説明も行っています。
-
-
cURLを利用する際の注意点「
&」があるURLは「”」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
-
Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説
お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。
-
-
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!
-
-
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方を解説。要素を取得する方法、そこから属性を取得する方法を解説。また、マニュアルにはない注意点なども解説。