ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  PHP >  PHP range関数を使って階乗と重複組み合わせを計算

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

PHP range関数を使って階乗と重複組み合わせを計算

「乱数発生器」
 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という関数を使って処理を作ってみました。
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 . "<br />";
}


また、実際のプログラムに組み込んでいる重複組み合わせの数を取得する関数は下記のようになります。

// 重複組み合わせの計算(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;
}

ちなみに、ここでは関数にしていますが、実際のプログラムでは関数にはしていません!

なぜなら、これまで十数年プログラムを組んできましたが、重複組み合わせが必要になったのはこれが初めてだからですね。
ここで関数を作っても、もう今後も使う機会はないでしょう。という判断ですね。


※一部、ソース上の「<」「>」などを全角文字で記述しています。
関連記事
スポンサーサイト
[ 2012年12月25日 10:29 ] カテゴリ:PHP | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。