PHP:: ランダムで2桁の整数10個を「かぶらないように」取得する【修正しました】

【2009/02/09追記しました。】

2桁の25ます計算
2桁の25ます計算

↑こういう100ます計算 的なpdfを自動生成するサービスを作っていました。
2桁(10~99)までのランダムな整数を縦横5ます分ずつ取得したいとします。
rand( 10,99 ) でループで毎回生成してもいいんですが、
ごくまれに、同じ数字がかぶって発生します。(ごくまれというか、rand()つかうと結構な確率で発生します。)

対処法を考えた結果・・・

10~99までの数字を順に配列 $num[] にぶち込む。
shuffle($num) で配列をまぜまぜする。
前から順に $tate[] , $yoko[] にしていく。
とりあえずコレで、かぶることはなくなりましたが、ちょっとやり方が富豪的か・・・?
まぁコスト的には微塵だからいいか・・・うごいてるし・・・。

【間違い(無駄処理)があります:追記で訂正しています。】

for( $i= 10 ; $i < = 99 ; $i++ ){ $num[]=$i; shuffle($num); } $j = 0; for( $i= 0 ; $i < 5 ; $i++ ){ $tate[$i] = $num[$j++]; $yoko[$i] = $num[$j++]; } [/php]

※このコードでやっても、なんか偏るなぁ・・・もう1回シャッフルするか?うーん。

もっと良い方法、誰か考えてor教えて?(--

追記【2009/02/09】
「php かぶらない」で検索してこられる方が結構いらっしゃるので、ぼーっと見てたんですが、
大きな間違いしてたので修正!!

for( $i= 10 ; $i < = 99 ; $i++ ){ $num[]=$i; } shuffle($num); //ループの外に出したよ! $j = 0; for( $i= 0 ; $i < 5 ; $i++ ){ $tate[$i] = $num[$j++]; $yoko[$i] = $num[$j++]; } [/php]

配列にぶち込むところだけループすればよかったのに、shuffle($num)も毎回ループしてた!!
誰かツッコミ入れてよ!汗

2 thoughts on “PHP:: ランダムで2桁の整数10個を「かぶらないように」取得する【修正しました】”

  1. おもしろいなぁ。
    雑誌の占いとかに使えそう。
    あとは数独作りとか?

    ツレのツレが出版社に勤めてて、数独パズルの本出したりするらしいんだけど、
    数独の問題ってパラメータをいくつか決めてボタン押すだけで
    コンピュータが勝手に作るんだって。

    数独の本はちょっと横につけたりするイラストとかだけで本出せて
    そこそこ売れるから儲かるらしいよ。

  2. コメントthx.
    せやねん、かなりおもろいねん。

    これは一例で実は地味にいろんなもんを生成するシステムできてるねんけど、
    これをビジネスに結びつけるのが下手やからなぁ俺、、、、

    ドカタプログラマとSEとコンサルと営業は両立せんわ 笑

コメントを残す

メールアドレスが公開されることはありません。