PHPを学ぼう!

▼PHPを学ぶチャプターです。


安心サポートのGOG!

 

素材メニュー

 ◆Chapter 1

 ◆Chapter 2

 ◆Chapter 3

 ◆Chapter 4

 

制作ヒント

 ◆制作のヒント

 

レッスンメニュー

 ◆Chapter2 練習問題

 ◆Chapter3 DB練習問題

 

サイト運営者がPHPを学んだ
お勧めの書籍です!
これ一冊で基本的なPHPの仕組み、簡単なプログラムの作成、SQLiteを使ったデータベースなどかなり学べる要素が詰まっています!

↓↓↓ ↓↓↓

PHPレッスンブック―PHP5対応

新品価格
¥2,520から
(2013/2/24 04:38時点)

 

 

サイバーテロの技法について書かれた書籍です!
ハッカーの手法を知ることでご自身のサイトがハッカーに攻撃されたときそれを防ぐ手法を紹介しています。

↓↓↓ ↓↓↓

PHPサイバーテロの技法―攻撃と防御の実際

新品価格
¥1,890から
(2013/11/5 10:09時点)

 

 

★初年度100円! サブドメインやメールアカウントを無制限に設置できます。
PHPやCGIは勿論、WordPress、Movable Type Open Source、掲示板、ブログ、ショッピングサイトなどが簡単に導入できるので複数サイトを運営したい場合に便利なサービスです。

↓↓↓ ↓↓↓

 

PHPが動作するサーバー

 

はじめてのHP | 無料素材 | タグ辞典 | CSSガイドEX | PHPを学ぼう!

◆Chapter 4 - LOT6の抽選番号をランダムで抽出する

LOT6 は、皆さんご存じの通り 43 個の数字の中から任意に 6 個の数字を選び見事に全て当てれば 1 等 2 億円(計算上)が獲得できる全国くじです。
しかしその確立は天文学的であり、当たる確率は 1/6,096,4546(0.00000016%) とされています。
雲を掴むような話ですね・・・。

  

毎回毎回、数字を考えるのも面倒くさいので店先に置いてあるツール(クイックピック)を使っていましたが全く当たる気がしません・・・。
そこで少しでも確立を上げる為、6パターンの条件でランダムに抽出するプログラムを作ってみました。
データを分析して 6 個の数字を抽出する高度なプログラムではありませんが、条件を付けることで当選確率を少しでも上げることができます。
array_rand 関数を利用したシンプルなものなので余り期待はもてませんが、もしかしたら、当選するなんてことがあるかもしれません(@も@)
その時はご報告いただけるとありがたいです。

  

このプログラムでは配列を使います。
配列の詳細については、『 ◆Chapter 2 - 配列 』を参照ください。

  

プログラムは次の仕様で 6 個の数字を選択します。

  • 43 個の中から 6 個の数字を選ぶ
  • 1~9 の番号を除外して 6 個の数字を選ぶ
  • 43 個の中から n 個の数字を削除して選ぶ
  • 43 個の中から n 個の数字を優先して選ぶ
  • 前回の当選番号を 1 個、または 2 個を選んで残りの数字を選ぶ
  • 3 組の番号を抽選、選ばれた番号を削除し 6 個の数字を選ぶ

  

  

【lot6.php】

001<?php
002  ##################################################
003  # LOT6 番号を選ぶ
004  ##################################################
005  //Lot6の番号43個を育生
006  function Lot6_Num(){
007    for($i=1; $i<=43; $i++){
008      $n[$i] = $i;
009    }
010    return $n;
011  }
012
013
014  //抽出したLot6の番号を書き出し
015  function Lot6_Array_Str($array, $mode, $str){
016    sort($array);
017    if($mode==1){
018      echo '<h1 style="color:red">'.implode(",", $array).'</h1>';
019    }else{
020      echo '<h3>'.$str."<br />".implode(",", $array).'</h3>';
021    }
022  }
023
024
025
026  //■43個の中から6個を選ぶ
027  function Lot6_normal(){
028    Lot6_Array_Str(array_rand(Lot6_Num(), 6), 1, "");
029  }
030  echo "<h1 style='margin:0 0 0 0'>■43個の中から6個を選ぶ</h1>";
031  Lot6_normal();
032
033
034  //■1~9の番号を除外して6個を選ぶ
035  function Lot6_1to9_del(){
036    $num43 = Lot6_Num();
037    for($i=1; $i<10; $i++){
038      unset($num43[$i]);
039    }
040    Lot6_Array_Str(array_rand($num43, 6), 1, "");
041  }
042  echo "<h1 style='margin:80px 0 0 0'>■1~9の番号を除外して6個を選ぶ</h1>";
043  Lot6_1to9_del();
044
045
046
047  //■43個の中からn個を削除して選ぶ
048  $dislike_num = array(6,16,17,20,22,43,34);
049  function Lot6_dislike($dislike_num){
050    Lot6_Array_Str($dislike_num, 0, "【削除する番号】");
051    $num = Lot6_Num();
052    for($i=0; $i<count($dislike_num); $i++){
053      unset($num[$dislike_num[$i]]);
054    }
055    Lot6_Array_Str(array_rand($Num43, 6), 1, "");
056  }
057  echo "<h1 style='margin:80px 0 0 0'>■43個の中からn個を削除して選ぶ</h1>";
058  Lot6_dislike($dislike_num);
059
060
061
062  //■43個の中からn個を優先して選ぶ
063  $like_num = array(10,20,30);
064  function Lot6_like($like_num){
065    Lot6_Array_Str($like_num, 0, "【優先する番号】");
066    if(count($like_num)>=6){
067      $n = array_rand($like_num, 6);
068      $new_n = array(
069        $like_num[$n[0]],
070        $like_num[$n[1]],
071        $like_num[$n[2]],
072        $like_num[$n[3]],
073        $like_num[$n[4]],
074        $like_num[$n[5]]
075      );
076      Lot6_Array_Str($new_n, 1, "");
077    }else{
078      $newCount = 6 - count($like_num);
079      $Num43 = Lot6_Num();
080      for($i=0; $i<count($like_num); $i++){
081        unset($Num43[$like_num[$i]]);
082      }
083      if($newCount==1){
084        array_push($like_num, array_rand($Num43));
085        $result = $like_num;
086      }else{
087        $n = array_rand($Num43, $newCount);
088        $result = array_merge($n, $like_num);
089      }
090      Lot6_Array_Str($result, 1, "");
091    }
092  }
093  echo "<h1 style='margin:80px 0 0 0'>■43個の中からn個を指定して選ぶ</h1>";
094  Lot6_like($like_num);
095
096
097
098  //■前回の当選番号を1個、または2個を選んで6個の数字を選ぶ
099  $choise_num = array(6,16,17,20,22,43,34);
100  function Lot6_choise($choise_num, $mode){
101    Lot6_Array_Str($choise_num, 0, "【前回当選番号】");
102    $Num43 = Lot6_Num();
103    if($mode==1){
104      for($i=0; $i<count($choise_num); $i++){
105        unset($Num43[$choise_num[$i]]);
106      }
107      $n = array_rand($choise_num);
108      $new_n = array($choise_num[$n]);
109      $result = array_merge($new_n, array_rand($Num43, 5));
110    }else{
111      for($i=0; $i<count($choise_num); $i++){
112        unset($Num43[$choise_num[$i]]);
113      }
114      $n = array_rand($choise_num, 2);
115      $new_n = array(
116        $choise_num[$n[0]],
117        $choise_num[$n[1]]
118      );
119      $result = array_merge($new_n, array_rand($Num43, 4));
120    }
121    Lot6_Array_Str($result, 1, "");
122  }
123  echo "<h1 style='margin:80px 0 0 0'>■前回の当選番号から1個、または2個を選ぶ</h1>";
124  Lot6_choise($choise_num, 0);
125
126
127
128  //■前回の当選番号と1~9の数字を削除し6個の数字を選ぶ
129  function Lot6_dislike_1to9($choise_num){
130    Lot6_Array_Str($choise_num, 0, "【前回当選番号】");
131    $Num43 = Lot6_Num();
132    for($i=1; $i<10; $i++){
133      unset($Num43[$i]);
134    }
135    for($i=0; $i<count($choise_num); $i++){
136      unset($Num43[$choise_num[$i]]);
137    }
138  Lot6_Array_Str(array_rand($Num43, 6), 1, "");
139
140  }
141  echo "<h1 style='margin:80px 0 0 0'>■前回の当選番号と1~9の数字を削除し6個の数字を選ぶ</h1>";
142  Lot6_dislike_1to9($choise_num);
143
144
145
146  //■3組の番号を抽選、選ばれた番号を削除し6個の数字を選ぶ
147  function Lot6_3line_dislike(){
148    $Num43 = Lot6_Num();
149    $n1 = array_rand($Num43, 6);
150    $n2 = array_rand($Num43, 6);
151    $n3 = array_rand($Num43, 6);
152    Lot6_Array_Str($n1, 0, "【番号1】");
153    Lot6_Array_Str($n2, 0, "【番号2】");
154    Lot6_Array_Str($n3, 0, "【番号3】");
155    for($i=0; $i<6; $i++){
156      unset($Num43[$n1[$i]]);
157      unset($Num43[$n2[$i]]);
158      unset($Num43[$n3[$i]]);
159    }
160    Lot6_Array_Str(array_rand($Num43, 6), 1, "");
161  }
162  echo "<h1 style='margin:80px 0 0 0'>■3組の番号を抽選、選ばれた番号を削除し6個の数字を選ぶ</h1>";
163  Lot6_3line_dislike();
164?>

  

  

Lot6_Num() は、43 個の数字から 6 個の数字を選択します。
条件を付けずに抽出するシンプルなプログラムです。
1 から 43 の数字を配列に格納、キーを "1" から振ることで後でデータを加工をしやすくしています。
カスタマイズ関数内で利用します。

  

Lot6_Array_Str($array, $mode, $str) は、配列に格納された値をソートして表示させるプログラムです。
$array に書き出したい配列、$mode に書式の選択、$str で注意書きを入れます。
カスタマイズ関数内で利用します。

  

  

これ以降は、LOT6 の番号を抽出するプログラムです。

  

  

  

🔶43 個の中から 6 個の数字を選ぶ

Lot6_normal() は、43 個の数字の中から抽出条件無しで 6 個の数字を選びます。
数字の抽出には配列から任意の個数を選択できる array_rand 関数を使用しています。
array_rand は、

array_rand($array, 6);

とすると配列( array )から 6 個をランダムに選びます。
数字を変えるだけで任意の数だけ選べるので便利な関数です。
1 個だけを選びたいときには、

array_rand($array);

とします。

  

  

🔶1 ~ 9 の番号を除外して 6 個を選ぶ

Lot6_1to9_del() は、1 ~ 9 の数字を除外して 6 個の番号を選びます。
配列のキーが、1 ~ 43 であれば、キーを使い配列の削除が簡単にできます。
ここでは for を使い 1 ~ 9 の数字を unset で削除した後、array_rand でランダムに数字を選んでいます。

  

ところで何で、
「 1 ~ 9 の数字を削除するのか? 」
と疑問に思った人も多いでしょう。
LOT6 の第 1 ~ 1200 回迄の統計をみると、300 回近くが 10 ~ 43 の数字で当選しています。
つまり、4 回に 1 回はこの範囲で当たり数字を出しているのです。
絞り込んだ数字であれば当選確率が少しは上がるので、この方法もありではないでしょうか。

 

  

  

  

🔶43 個の中から n 個を削除して選ぶ

Lot6_dislike($dislike_num) は、$dislike_num に当たりそうもない数字を n 個を配列で用意します。

//■43個の中からn個を削除して選ぶ
$dislike_num = array(10,20,30,40,5,15,25,35);

  

配列に外れそうな数字を格納することで、それらの数字を除外しランダムで 6 個の数字を選びます。
例えば、絶対にこないであろう数字の直感がある時、前回の当選番号を外したい時、1 ~ 9 と 40 ~ 43 の数字を外したい時には使えそうですね。

  

  

  

🔶43 個の中から n 個を優先して選ぶ

Lot6_like($like_num) は、$like_num に当たりそうな数字を n 個を配列で用意します。

//■43個の中からn個を優先して選ぶ
$like_num = array(10,20,30);

配列には、n 個格納できますがフォーム入力を想定していませんので 44 以上の数字、整数の判定などは除外しています。

  

配列の個数が 6 個未満の場合は足りない分をランダムに抽選、7 個以上の場合は配列の中から 6 個を抽選します。

  

理由は分りませんが、 array_rand は変数として代入すると多元配列になるのか正常に使えません。
print_r や var_damp を使用してもその内容を確認できないのです。
67 ~ 75 行ではわざと変数に代入しています。

67 ~ 75 行は、76 行目を

Lot6_Array_Str(array_rand($like_num, 6), 1, "");

に変更することで 1 行でも動作します。
変数に代入した使い方がわかるまで苦戦しました・・・。
array_rand を変数に代入して使い方に困ったら以下を参考にしてください。

  

67~75行では変数に代入し直しています。
この使い方がわかるまで苦戦しました・・・。
array_rand を変数に代入するときのは以下を参考にしてください。

  

普通、変数に配列を代入したら、echoを使った場合には次の様に書き出すと考えます。

$n = array_rand($like_num, 3);
echo $n[0];
echo $n[1];
echo $n[2];

しかし、array_randで変数に代入すると、このやり方では正常に書き出されないので次の通りにします。

echo $like_num[$n[0]];
echo $like_num[$n[1]];
echo $like_num[$n[2]];

知っていないと、訳がわからないですよね・・・。

  

  

  

🔶前回の当選番号を 1 個、または 2 個を選んで 6 個の数字を選ぶ

Lot6_choise($choise_num, $mode) は、$choise_num に前回の当選番号を格納し、その中から 1 個、あるは 2 個を選択します。
残りはランダムで選ぶプログラムです。

//■前回の当選番号を1個、または2個を選んで6個の数字を選ぶ
$choise_num = array(6,16,17,20,22,43,34);

  

これは前回の当選番号の内、1 個あるいは 2 個が次の当選番号に継承されることも少なくないからです。
好きな番号だけを入力しその中から 1 個あるいは 2 個を選び、残りをランダムで選びこともできます。

$mode に "1" を指定すると配列から 1 個、その他は 2 個を選択します。

  

  

  

🔶前回の当選番号と 1 ~ 9 の数字を削除し 6 個の数字を選ぶ

Lot6_dislike_1to9 は、$choise_num に前回の当選番号を格納します。
ここでは、Lot6_Choise で使用したものをそのまま使います。

  

LOT6 では前回の当選番号が次の当選に継承されず、 1 ~ 9 の数字が含まれない傾向もすくなからずあります。ヤマを張る時には有効でしょう。
15 個の数字を除外するのですから当選番号がこの傾向の時には当選確立が少しは上がります。

  

  

  

🔶3 組の番号を抽選、選ばれた番号を削除し 6 個の数字を選ぶ

Lot6_3line_dislike() は、3組の数字をまず選びます。 選ばれた18個の数字(重複あり)を除外して6個の数字を選び直すプログラムです。

  

LOT6 を 3 組の番号を選んでも 1 つも数字が当たらないことがあります。
ならば逆手にとって選んだ数字を除外するものをプログラムを作ってみました。
最大 18 個の数字を除外するので当たる確率は 1/3 近くになります。
しかし分母が大きすぎるので期待はできませんが・・・・、余りにも当たらないという人は試してみては如何でしょうか。

  

  

以上が、array_rand を使った配列をランダムにする方法の紹介でした。
この他の条件については、ご自身で考慮してみてください。

  

  

[2017年9月11日 公開]

  

  

一括ダウンロード

 

 

 

 

 

 

 

 

 

 

 

 

 

ex-mode.net | ツールEX | 素材EX | アフィモール | 初級者向 初めてのホームページ作り | Htmlタグ辞典 | 初めてのプランター菜園 | リンク・ボード
気のみ気のままなブログ | CSSガイドEX | ホビ★コレ | 班長日記!

▲UP

Copyright (C) ex-mode.net 2017. All Rights Reserved.