- 締切済み
【乱数発生】 JavascriptからPerlへ移植したい
テニスのダブルス組み合わせ用のスクリプトを考えております。 ネットでいろいろ Javascriptでは教えていただいたのですが、 携帯からはJS使えないことを後で知り、 Perl-CGIならいけるのでは?と。 Perlについてまったくわからないので 下記の件について、大変僭越ではありますが 移植をお願いしたいのです(;^_^A 【何をしたいのか】 ・テキストボックスで任意の数字(整数)で範囲と行数を指定。 ・結果は数値4個固定とし、4個で1グループ。この4個内は重複がないように。 ・4個1グループを指定の行数分求める。 ・このとき、なるべくならすでに出た数字は後回しにしたい。例えば1~10の範囲としたら、1~10すべて出るまでは一度出た数字は後回しになるように。 ・小さい範囲で大きな行数を指定すれば、必ず同じ組み合わせが出ることは了承。 ・結果は下記のようにしたい。 1,6,8,3 2,4,5,10 9,7,2,3 ・ ・ 3,6,8,1(1行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可) 以下は、Javascriptで稼動するソースになります。 ※後半のFORM部分からPOSTして CGIにて受取、乱数生成したHTMLを表示させるようにしたいのです。 ---------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <script type="text/javascript"> <!-- function OnceRand(min, max) { if(isNaN(min) || isNaN(max) || parseInt(min) >= parseInt(max)) throw new Error("指定の値に誤りがあります。"); this.min = parseInt(min); this.max = parseInt(max); this.createArray(); } /* 配列を作成します。 */ OnceRand.prototype.createArray = function() { this.original = []; for(var ix = this.min; ix <= this.max; ix++) { this.original.push(ix); } this.arr = this.original.concat(); }; /* 次の値を取り出します。 */ OnceRand.prototype.next = function(length) { var per = []; if(0 >= length) return per; for(var ix = 0; ix < length; ix++) { if(this.arr.length <= 0) this.arr = this.original.concat(); do { var dup = false; var ax = Math.floor(Math.random() * this.arr.length); for(var px = 0; px < per.length; px++) { if(per[px] == this.arr[ax]) dup = true; } } while(dup) per.push(this.arr.splice(ax, 1)[0]); } return per; }; /* 乱数を生成します。 */ function genRandom() { var minBox = document.getElementById("min"); var maxBox = document.getElementById("max"); var lineBox = document.getElementById("line"); var console = document.getElementById("console"); var consoleClone = console.cloneNode(false); var lineMax = parseInt(lineBox.value); var rand1 = new OnceRand(minBox.value, maxBox.value); for(var lx = 0; lx < lineMax; lx++) { var texts = rand1.next(4); var textLine = document.createTextNode(texts.join(" ,")); var breakLine = document.createElement("br"); consoleClone.appendChild(textLine); consoleClone.appendChild(breakLine); } console.parentNode.replaceChild(consoleClone, console); } // --> </script> <title>範囲乱数</title> </head> <!--ここからはページ表示部分--> <body> <div> 範囲:<input type="text" id="min" value="" size=2 maxlength=2> ~<input type="text" id="max" value="" size=2 maxlength=2> <br> 行数:<input type="text" id="line" value="" size=2 maxlength=2> <br> <input type="button" value="乱数発生" onclick="genRandom();"> </div> <div id="console"></div> </body> </html> -------------------------------------------------------
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ORUKA1951
- ベストアンサー率45% (5062/11036)
たとえば、 組み合わせ ( http://iruka.la.coocan.jp/cgi-bin/members.cgi ) な感じかな??
- ORUKA1951
- ベストアンサー率45% (5062/11036)
サーバーサイドでjavascriptも可能ですが、そうなるとHTMLを書き出すことになる--文字を複雑に扱うことになるので、圧倒的にPerlが便利です。 このプログラムの処理過程で、他のプログラムに使えそうなアルゴリズムがあるので、それらをサブルーチン化して置くと良いですね。 トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか ちょっと考えて見ます。
お礼
やはり、サーバーサイドならPerlのほうが柔軟性ありますしね(^-^) >トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか >ちょっと考えて見ます。 すみません、お力お借りしたいです(;^_^A
- ORUKA1951
- ベストアンサー率45% (5062/11036)
面白そう。 メンバーを配列に入れて、その数から乱数を発生して一人除く、残った配列から同じ事を繰り返せばできますね。 $picup = splice(@noOrderdMembers,int (rand( $num )),1); 本体は数行ですむけど、それを使えるようにするには、ちょっと手を加えないと。 なお、これだけじゃ面白くないので、色々応用が利く物にしないとダメだな・・・
お礼
ありがとうございます♪ ここ数日、JSとPerlのリファレンスを見比べながら 同じように書いてみようと思ったのですが 全然うまくいかなくて、参りました(;^_^A たとえば、このJSをなんとかサーバーサイドで動くように できないものでしょうか?
お礼
これはすごいです(*゜▽゜)ノ 名前まで登録できたり CSV出力までできるなんて・・・ まさに希望どおりになっております♪