• 締切済み

【乱数発生】 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> -------------------------------------------------------

  • Perl
  • 回答数3
  • ありがとう数5

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

たとえば、 組み合わせ ( http://iruka.la.coocan.jp/cgi-bin/members.cgi ) な感じかな??

Tobykun
質問者

お礼

これはすごいです(*゜▽゜)ノ 名前まで登録できたり CSV出力までできるなんて・・・ まさに希望どおりになっております♪

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

 サーバーサイドでjavascriptも可能ですが、そうなるとHTMLを書き出すことになる--文字を複雑に扱うことになるので、圧倒的にPerlが便利です。  このプログラムの処理過程で、他のプログラムに使えそうなアルゴリズムがあるので、それらをサブルーチン化して置くと良いですね。  トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか  ちょっと考えて見ます。

Tobykun
質問者

お礼

やはり、サーバーサイドならPerlのほうが柔軟性ありますしね(^-^) >トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか >ちょっと考えて見ます。 すみません、お力お借りしたいです(;^_^A

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

面白そう。 メンバーを配列に入れて、その数から乱数を発生して一人除く、残った配列から同じ事を繰り返せばできますね。 $picup = splice(@noOrderdMembers,int (rand( $num )),1); 本体は数行ですむけど、それを使えるようにするには、ちょっと手を加えないと。 なお、これだけじゃ面白くないので、色々応用が利く物にしないとダメだな・・・

Tobykun
質問者

お礼

ありがとうございます♪ ここ数日、JSとPerlのリファレンスを見比べながら 同じように書いてみようと思ったのですが 全然うまくいかなくて、参りました(;^_^A たとえば、このJSをなんとかサーバーサイドで動くように できないものでしょうか?

関連するQ&A

  • 【乱数】任意の範囲、固定個数、重複しない乱数

    テニスのダブルス組み合わせ用のスクリプトを考えております。 ネットでいろいろ探して試してみましたが Javascript初心者で、寄せ集めでは限界がありますので質問させてください(;^_^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行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可) 【現在の状況】 ネットで拾ったサンプルから、何をどのように書き換えたらいいのかわからずです(;^_^A 【サンプルの提示】 ■範囲の乱数■ <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- function gen_random(num1, num2) { retval=Math.random(); document.write(Math.floor(retval * (num2 - num1)) + eval(num1)); } //--> </SCRIPT> </HEAD> <BODY> <center> <table border=1 cellpadding=4> <form name=myform> <tr><td bgcolor=#ffffe4 align=center> <font color=blue> 乱数の範囲 </td></tr> <tr><td align=center> <input type=text name=d1 size=2 maxlength=2> ~ <input type=text name=d2 size=4 maxlength=4> </td></tr> <tr><td align=center> <input type=button name=btn1 value=乱数発生 onClick=gen_random(myform.d1.value,myform.d2.value)><br> </td></tr> </form> </table> </center> </BODY> </HTML> ---------------------------------------- ■30個を5行ずつ出している <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> var i; for(i=1 ; i <=30 ;i++) { document.write(Math.floor(Math.random()*10) +"<BR>"); if(i%5 == 0) document.write("<HR>"); } </SCRIPT> </HEAD> <BODY> </BODY> </HTML> --------------------------------------------------------- ■重複しない、しかも後回しになる?■ <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> //once_rand: min以上max未満の重複しない乱数を生成するためのオブジェクト function once_rand(min,max){   this.cnt=max-min;   this.arr=[];   //乱数候補を配列に格納   for(var i=0;i<this.cnt;i++){this.arr[i]=min++;} } //乱数を取り出すメソッド once_rand.prototype.next=function(){   if(this.cnt<=0){     //もう乱数候補が残っていない     return undefined;   }   //乱数を取り出す位置を決定   var idx=Math.floor(Math.random()*(this.cnt));   //乱数を取り出す   var rand_val=this.arr[idx];   //重複しないように最後尾の要素で上書き(今のthis.arr[this.cnt-1]は次回以降使われない)   this.arr[idx]=this.arr[this.cnt-1];   //残りの乱数候補が減少   this.cnt--;   return rand_val; } //テスト var rand1 = new once_rand(1,15); //1以上15未満 var str=rand1.next(); while(1){   var rand_val=rand1.next(); //乱数を取り出す   if(rand_val == undefined){break;}   str += ","+rand_val; } alert(str); </SCRIPT> </HEAD>

  • javascript 乱数が取得できない

    はじめまして。 一月ほど前から「パズルネット ソフィア」 http://www.pori2.net/js/number/4.html というサイトでjavascriptの基礎を学んでいるのですが、乱数 を扱う段階になって自分の作成したプログラム(以下) <html> <head> </head> <body onload="Mondai()"> <form name="quiz"> <input type="text" value="" > <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- var col=new Array("red","bleu","yellow","green","white"); var Rnd; function Mondai(){ Rnd=Math.floor(Math.random() * 5 ); document.quiz.element[0].value=col[Rnd]; } function Push(num){ var n=parseInt(num); if( n==Rnd ){ Mondai(); }else{ alert("違います。"); } } // --></script> </body> </html> を実行してもテキストボックス内に何の値も表示されず 、ボタンを押しても「違います。」とだけしか出てきません。 ブラウザはfirefoxを使用しており、javascriptの設定もonに なっています。 カンマや鍵括弧などの記号にも打ち間違いがないかサンプル プログラムを参考にしながら確認してみたのですが、どこにも おかしな点はありませんでした。 サンプルプログラムは下記のとおりで、こちらは正常に実行されます。 <body onload="Mondai()"> <form name="quiz"> <input type="text" value=""> <input type="button" value="赤" onclick="Push(0)"> <input type="button" value="青" onclick="Push(1)"> <input type="button" value="黄" onclick="Push(2)"> <input type="button" value="緑" onclick="Push(3)"> <input type="button" value="白" onclick="Push(4)"> </form> <script type="text/javascript"> <!-- //色名の英単語を配列に入れる var col=new Array("red","blue","yellow","green","white"); //乱数を入れる変数 var Rnd; //テキストボックスに問題文(色名)を表示する関数 function Mondai(){ //0~4までの乱数を発生させる Rnd=Math.floor( Math.random() * 5 ); document.quiz.elements[0].value=col[Rnd]; } //正誤判定関数 function Push(num){ //引数を数字に変換 var n=parseInt(num); //正解なら次の問題を表示、間違っていたらアラートを表示する if ( n == Rnd ){ Mondai(); }else{ alert("違います!"); } } // --> </script> どなたかアドバイスをいただけないでしょうか? よろしくお願いします。

  • JavaScriptで簡単な計算機を作りたいのですが…

    初めて質問させていただきます。タイトルどおり、以下の様なコードを組んだのですが答えが表示されません。なにぶんJavaScriptを勉強し始めて数日の初心者なもので、どこが悪いのか見当がつきません。レベルの低い質問で申し訳ないのですが、皆さんのお知恵をお貸しください。 <html> <head> <title>JAVAscript</title> <SCRIPT LANGUAGE="JavaScript"> <!-- function func(){ a=parseInt(document.masu.0.value); b=parseInt(document.masu.1.value); c=a+b; document.masu.2.value=c; //--> </SCRIPT> </head> <body> <form name="masu"> <input type="text" name="0" SIZE=10 onkeyup="chkNum(this)"> <input type="text" name="1" SIZE=10 onkeyup="chkNum(this)"> <input type="text" name="2" SIZE=10"onkeyup="chkNum(this)"> <input type="button" value="計算" onclick="func()"> </form> </body> </html>

  • javascriptのアラートの表示方法について

    javascript初心者です。 javascriptで、計算機を作っていて、数字を入れずに 「=」(計算)ボタンを押すと、 「未入力です」とアラ-トで表示させたいのですが、 やり方がわかりません。 お手数ですが、ご教示下さい! よろしくお願いします!! ※以下、私が作成したものです。 この中のどの部分に、どのような表記をいれたら良いのか、 教えてください。。 <html>   <head>    <title>計算機</title>   <script type="text/javascript">     function Calc() {    var a;    var b;    var c;    var ope;        a = parseInt(document.form1.textA.value);    b = parseInt(document.form1.textB.value);    ope = parseInt(document.form1.selOpe.value);        switch (ope) {   case 1:c = a + b;    break;   case 2:c = a - b;    break;   case 3:c = a * b;    break;   case 4:c = a / b;    break;   default:   break;    }    document.form1.textC.value = c;    }   </script>    </head>     <body>     <form name="form1">      <INPUT TYPE="text" NAME="textA">       <select name="selOpe" size=1>       <option value="1">+</option>       <option value="2">-</option>       <option value="3">×</option>       <option value="4">÷</option>       </select>        <INPUT TYPE="text" NAME="textB">         <input type="button" name="cmdCalc" value="=" onclick="Calc()">        <INPUT TYPE="text" NAME="textC">     </form>     </body> </html>

  • XHTMLとJavascript・CSSで表示位置の固定方法について

    HTMLからXHTMLへソースをそのままで移行したら位置の固定がされなくなりました。 <div id="msg">message</div>の部分をスクロールしても常に同じ場所に表示したいです。 XHTMLの知識が殆どなく、原因が判りません。 Javascriptを別ファイルにしても動きませんでした。 修正方法、もしくは代替案をお願いします。 宜しくお願いいたします <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="content-script-type" content="text/javascript" /> <script type="text/javascript"> var offX = 0; var offY = 0; function setMenu(){ if(document.all){ var mx = parseInt(document.body.scrollLeft+offX); var my = parseInt(document.body.scrollTop+offY); } else { var mx = parseInt(self.pageXOffset+offX); var my = parseInt(self.pageYOffset+offY); } if(document.getElementById){ document.getElementById('msg').style.left=mx; document.getElementById('msg').style.top=my; }else if(document.all){ document.all('msg').style.pixelLeft=mx; document.all('msg').style.pixelTop=my; }else if(document.layers){ document.layers['msg'].moveTo(mx,my); } } onscroll = setMenu; onresize=setMenu; //--> </script></head> <body bgcolor="#111144"> <div id="msg"> message </div> </body> </html>

  • javascript バーコード読み取りについて

    バーコードを読み込んだ際に、重量だけ表示させたいので自分で考えてソースコードを書きましたが、実行されません。 下記のコードの何処を直せばいいかわかりません。教えてください。 <!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var textbox = document.getElementById("barcode"); function extract() { var textbox2 = document.getElementById("toridasi"); if(textbox.value !== null) { if (textbox.value.length > 47) { var amount = textbox.value.substr(22,3); textbox2.value =amount/10; } } } textbox.onchange = extract(); </script> </head> <body> バーコード: <input type="text" id="barcode" size="64" value="1"> <input type="button" value="部分取り出し" onclick="extract()"> <input type="text" id="toridasi" size="10" value=""> </body> </html>

    • ベストアンサー
    • HTML
  • 親フレームの変数にアクセス(JavaScript)

    [index.html] <script src="script.js"></script> <frameset rows="50%,*" frameborder="1"> <frame src="content1.html"name="cont1"> <frame src="content2.html" name="cont2"> </frameset> [script.js] var test_text="てすと"; [content1.html] <form> <input type="text" name="in"> <input type="button" onClick="window.parent.test_text = document.forms[0].in.value;" value="IN"> </form> [content2.html] <form> <input type="text" name="out"> <input type="button" onClick="document.forms[0].out.value = window.parent.test_text;" value="OUT"> </form> のようになっています。 「index.html」の「script.js」の変数に、「content.1html」と「content2.html」からアクセスしたいです。 ですが、フレームになっているため、思うような動作をしてくれません。 よろしくお願いします。

  • javascript初心者です。

    javascript初心者です。 下記のソースコードで、単純に、マウスホーバーで、テキストの内容を切り替えるものですが、 IE8ですと動作しますが、Firefox3.5だと動作しません。 なにか、原因あるのでしょうか。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <title>無題ドキュメント</title> <script language="javascript" type="text/javascript"> function formcalc(formobj){ var val_a= formobj.elements["para_a"].value; var val_b= formobj.elements["para_b"].value formobj.elements["answer"].value = val_a * val_b } function chktext(){ var obj = document.getElementById("id1"); obj.innerText="テキスト変更しました。"; } </script> </head> <body> <form> <input size="10" type="text" name="para_a" value="0" />× <input size="10" type="text" name="para_b" value="0" />= <input size="10" type="text" name="answer" /><br /> <input type="button" name="keisan" value="計算" onclick="formcalc(this.form)" /> </form> <br /><br /><br /><br /> <p id="id1" onMouseOver="this.innerText='受付終了'">最初のテキスト</p> </body> </html>

  • VBSからjavascript

    下記ソースの指定の箇所からjavascriptのfunction fun1(1)をよびたいのですがどう記述したらいいでしょうか。 (ちなみにbody onload=は使わない条件です) <%@ LANGUAGE = VBSCRIPT %> <html> <head> <script type="text/javascript"> <!-- //禁止、許可 function fun1(is){ var is; var i; var jj; jj=document.form1.text2.length; for (i=0;i<jj;i++){ if (is==1) document.form1.text2[i].disabled=true; if (is==2) document.form1.text2[i].disabled=false; } } //--> </script> </head> <html> <body> <form name="form1"> <input type="text" name="text2" size="14" maxlength="8" value="ABC"> <input type="text" name="text2" size="14" maxlength="8" value="DEF"> <% <-------------------ここでfun1(1)をよびたい fun(1)と書いてもエラー >% </form> </body> </html>

  • javascriptで歪度と尖度を求めるコード

    サイトを参考に不偏分散から歪度と尖度を下記のコードで求めることが出来たのですが、 <!DOCTYPE html> <html lang="ja"> <head> <meta charset=utf-8 > <title>unbiased_Variance</title> </head> <body> <script> const arr = [70,71,70,74,75,73,72] // 平均値を計算 let sum = 0; arr.forEach((x, i) => sum += x) const ave = sum / arr.length; // 分散を計算 let dist = 0; arr.forEach((x, i) => dist += (x - ave) ** 2) const unbiasedVariance = dist / (arr.length-1); //不偏分散 const SD = Math.sqrt(dist / (arr.length-1)); // 歪度と尖度を計算 let sum3 = 0; let sum4 = 0; for (var i in arr){ sum3 += Math.pow((arr[i] - ave)/SD, 3); sum4 += Math.pow((arr[i] - ave)/SD, 4); } const skew = sum3*arr.length/(arr.length-1)/(arr.length-2); const exKurt = arr.length*(arr.length+1)/(arr.length-1)/(arr.length-2)/(arr.length-3)*sum4 - 3*(arr.length-1)*(arr.length-1)/(arr.length-2)/(arr.length-3); console.log(unbiasedVariance); console.log(skew); console.log(exKurt); </script> </body> </html> javascriptはコピペで使用が主なので複雑な計算方法の書き方は分かりません、そこでこんな形のコピペのコードが出来上がりました。 配列から歪度と尖度を求めるコードをもっとすっきりした形になればと思い質問しました。もし宜しければご教授お願います。

専門家に質問してみよう