二次元配列に数字をランダムに入れる

このQ&Aのポイント
  • 二次元配列に数字をランダムに入れる処理方法を教えてください。
  • 乱数を使用して二次元配列にランダムな数字を入れる方法を教えてください。
  • 二次元配列にランダムな値を入れる方法について教えてください。
回答を見る
  • ベストアンサー

二次元配列に数字をランダムに入れる

--------------------------- | 2 | 3 | 7 | 4 | 1 || 17 |<横合計> --------------------------- | 6 | 1 | 2 | 3 | / || // | --------------------------- | 1 | / | / | / | / || // | --------------------------- | 2 | / | / | / | / || // | --------------------------- | 3 | / | / | / | / || // | --------------------------- --------------------------- | 14 | / | / | / | / || // |<全合計> --------------------------- <縦合計> このように表示される。 …という処理がしたいのですがどういう処理を書けば良いのかわかりません。 理解した(1)と(2)の乱数発生の文を書いておきます。 *二次元配列を作成* a = new Array(5) for (i = 0; i <= a.length-1; i++){ //1次元 a[i] = new Array(5) for (j = 0; j <= a[i].length-1; j++){ //2次元 a[i][j] = "["+ i +","+ j +"]" var g = ""; document.write(a[i][j]); } } *乱数を100回発生* var z = ""; for(k = 1; k <= 100; k++){ z = Math.round(Math.random()); //発生した乱数をzに代入 } 以上、 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

おおむね分かったんですが あと一点、わからない部分があります。 >(2)乱数を100回発生させて、25マスの何処かに入る様にする。 何処かに入る、とはどういった基準で入れるんでしょうか? Math.randomは 0~1未満(0.999~9) の乱数値を発生する関数ですが、 発生した値と入れるべきマス目の関係性は?? 乱数が25種類(0~24)になるように調整すればいいのでしょうか? Yesなら→以下を前回のサンプルの 2次元配列作成 の辺りと差し替え //2次元配列作成(0回で初期化) a = new Array(5); for (i = 0; i <= a.length-1; i++){ //1次元 a[i] = new Array(5); for (j = 0; j <= a[i].length-1; j++){ //2次元 a[i][j]=0; } } //0~24の乱数を発生させ2次元配列に格納 for(k=0;k<100;k++){ g = parseInt(Math.random() *25);//乱数(0~24) x = parseInt(g/5);// g÷5(余りは切り捨て) y = g%5;// g÷5の余り a[x][y]++;//該当するマス目の発生回数をカウントアップ }

mocococo
質問者

お礼

お礼が遅くなって申し訳ありません。 steel_grayさんのおかげで、したかった処理が出来ました。 説明が言葉足らずで分かりにくかったとは思いますが、ずっと付き合って考えていただいて本当にありがとうございました!

その他の回答 (2)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

#1です。 >「乱数発生回数の合計」ではなく「乱数の合計」を出しているようです。 まさしく乱数の合計を出すサンプルを作りました。 途中までのコードや、 表の「/」や「//」が何を表わしているとか なんだか分からなかったもんで。 サンプルが参考になって正解が出ればよいのですが、 もし引き続きお困りでしたら 「乱数発生回数の合計」というのが何の事だかもう少し詳しく補足していただければまた何かアドバイスできるかもしれません。

mocococo
質問者

補足

大切な説明部分が抜けておりました! 申し訳ありません! 箇条書きで失礼します。 (1)縦に5マス、横に5マス、合計25マスの器を作る。 (2)乱数を100回発生させて、25マスの何処かに入る様にする。 (3)各マスの乱数発生回数を表示する。 (4)結果表示の際、縦、横の合計欄を追加する。 --------------------- | 2 | 3 | 7 | 4 | 1 | --------------------- ↑この数は、このマスに何回乱数が入ったか、という数になります。 お手数おかけします。 お願いいたします。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

もーひとつ、どうしたいのかがわからないのですが、一応サンプルを。 <html> <head> <style type="text/css"> <!-- td,th{ border:1px solid gray; } td{ text-align:right;/*数値なので右寄せに*/ font-family:monospace;/*数値なので等幅フォントに*/ } --> </style> </head> <body> <table id="T"> <tr><th></th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>計</th></tr> <tr><th>1</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><th>2</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><th>3</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><th>4</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><th>5</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> <tr><th>計</th><td></td><td></td><td></td><td></td><td></td><td></td></tr> </table> <script type="text/javascript"> <!-- var T = document.getElementById('T'); //2次元配列作成 a = new Array(5); for (i = 0; i <= a.length-1; i++){ //1次元 a[i] = new Array(5) for (j = 0; j <= a[i].length-1; j++){ //2次元 a[i][j] = parseInt(Math.random() *100) ;//0~99の乱数 } } //2次元配列をテーブルに設定(&計の算出) ttate = [0,0,0,0,0];//縦欄の計の配列(0で初期化) total=0;//総合計 for (i = 0; i <= a.length-1; i++){ tyoko = 0;//横の計 for (j = 0; j <= a[i].length-1; j++){ T.rows[i+1].cells[j+1].appendChild(document.createTextNode(a[i][j])); tyoko += a[i][j]; ttate[j]+=a[i][j]; } T.rows[i+1].cells[j+1].appendChild(document.createTextNode(tyoko)); } for (j = 0; j <= a[0].length-1; j++){ T.rows[i+1].cells[j+1].appendChild(document.createTextNode(ttate[j])); total+=ttate[j]; } T.rows[i+1].cells[j+1].appendChild(document.createTextNode(total)); //--> </script> </body> </html>

mocococo
質問者

補足

すばやい回答ありがとうございます。 教えていただいてとても言い難いのですが、 「乱数発生回数の合計」ではなく「乱数の合計」を出しているようです。 教えていただいた処理を参考に考えてみたいと思います。

関連するQ&A

  • 多次元配列とfor文について

    javascriptの配列について質問です。 例えば: var arrXXX = new Array(); function samplefunc{ //3次元配列の種類の作成 for (m = 0; m < aaa.length ; m++) { //連想配列作成 arrXXX .push(aaa[m]); } for (j = 0; j < bbb.length; j++) { for (i = 0; i < ccc.length; i++) { arrXXX[aaa[j]] = new Array(ccc.length); arrXXX[aaa[j]][i] = new Array(ccc.length); for (k = 0; k < ddd.length; k++) { arrXXX[aaa[j]][i][k] = eee;     ここでは配列を適切に使える・・・ } } } ここでarrXXXを使いたいが、3次元配列でなくなっている?!  arrXXX[~][0][0]はnullまたはオブジェクトではありません・・・がでます。 } 結局、for文を完全にでてしまうと、せっかくつくった配列がダメになってしまいます。どうすればfor文外で配列を使用できるのか教えてください!

  • javascriptの2次元配列をソートの仕方

    function word_grouping(data) { var code = data; //先頭についている”code="を除去 code = code.replace("code=",""); var = code.split(","); var alpha =new Array(); alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M']; //2次元配列作成 var array = new Array(); for (i =0; i < alpha.length; i++) { array[i] = [' ','0']: } //グループ名を格納 for( i = 0; i <alpha.length; i++){ array[i][0] = alpha[i] //0番目の項目から順番にグループごとに分ける for( i = 0; i < sp.length; i++){ group = sp[i].substring(0.1); //どのグループに所属しているか調べる for( j = 0; j < alpha.length; j++){ //一致したグループの配列にカウント+1していく if(group == array[j][0]{ array[j][1]++; } } } メモ ・spにはグループのどこかに所属する20個のキーワードが入っていてそれをグループに振り分けている ・グループ分けには”A001”のAだけみて振り分けています したいこと ・arrayに入ったキーワードの数を降順で並び替えたい 分からない所 ・2次元配列をsortする仕方 こんな感じなんです わかる方回答お願いします。

  • 重複しない乱数を作り配列に入れる(AS3.0)

    Flash Pro CS5 AS3.0 で記述しています。 1~10の整数をランダムかつ重複せずに配列に格納したいと考えています。 そこで,ネット上で参考になるソースを見つけ, 以下のように書き直しました。 var int_a = new Array(); var int_b = new Array(); function RandomInt():void{ //ここだけ変更すればよい var maxN:Number = 10;//乱数の最大値 //0~maxNの数字を全部配列に入れる for (var i:int=0; i< maxN; i++) { int_a[i] = i+1; } var j:Number = 0; var a_length:Number = int_a.length; //要は配列をシャッフルする while (a_length) { var int_r:Number = Math.floor(Math.random()*(maxN+1-j)); //乱発生した整数を配列int_bに順番に入れ、int_aから削除する int_b[j] = int_a.splice(int_r, 1); j++; //配列int_a内の数字が一つずつ減っていく a_length = int_a.length; } //ここで配列int_bがシャッフルされた trace(int_b); } RandomInt(); としました。 しかし出力結果がなぜか 8,2,4,9,,7,6,5,10,3,1のように抜けている部分があり, 次のフレームで for(var j:int=1; j <= 10; j++){   trace(int_b[j]); } として確認してもやはり 2 4 9 7 6 5 10 3 1 となってしまします。 どの部分がおかしいのか教えていただきたいです。 また,乱数発生の部分で Math.floor(Math.random()*(maxN+1-j)); という風に記述してあったのですが,ここは間違いではないのでしょうか? jを引いていくと発生する乱数の範囲が徐々に狭くなっていってしまうと思ったのですが; それとも元のソースコードを使って ttp://www.renowan.com/blog/?p=143 0~9までの乱数を発生させてそれぞれに1を足す方が簡単でしょうか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • JavaScriptについての質問です。

    ガウスの消去法による解の求め方をプログラムしたいのですが、上手くいかなかったので質問しました。以下のプログラムから実行はできるのですが、解が求められていませんでした。 どこを変えればきちんとできるのでしょうか、回答お願いします。 var A=[[1,-1,1],[1,2,0],[2,0,3]],b=[5,1,9]; WScript.Echo("ガウスの消去法の解:\n"+Gauss(A,b)); function Gauss(A,b) { var s,x=new Array(A.length),M=new Array(A.length); for(var i=k+1;i<A.length-1;k++) { for(var i=k+1;i<A.length;i++) { M[i]=new Array(A.length); M[i][k]=(A[i][k])/(A[k][k]); for(var j=k+1;j<A.length ;j++) A[i][j]=A[i][j]-(M[i][k]*A[k][j]); b[i]=b[i]-(M[i][k]*b[k]); } } for(var i=A.lengh-1;i>=0;i--) { s=0; for(var k=i+1;k<A.length;k++) s+=A[i][k]*x[k]; x[i]=(1/A[i][i])*(b[i]-s); } return x; }

  • JScriptの添削お願いします。

    連立一次方程式の解を求めるプログラムです。 下のプログラムで示した部分で2次元配列の行データの初期化をしたいのですがうまくいきません。 たぶんそこだけ間違えているだけだとは思いますが、他に間違えているところもあれば指摘お願いします。 全体的な書き直しで訂正を頂くよりも、今の状態からどこを直せばいいのか教えてもらえると勉強になります。 また、定数が3つから4つに増えた場合は、※(下記参照お願いします)にて単純に数字をコンマで区切って4つに増やせばいいのでしょうか? 例)var A=[ [1,-4,3.3], [1,-5,2.3], [1,-1,1.3], ],b=[-1,2,0.3] 他に下の方のプログラムも変えなければいけないのでしょうか? 以上質問2つありますが、片方だけでも結構ですのでよろしくお願いします。 以下がプログラムになります。 var A=[ [1,-4,3], [1,-5,2], [1,-1,1], ],b=[-1,2,0] //※ WScript.Echo("ガウスの消去法による解:"+Gauss(A,b)); function Gauss(A,b){ var s,x=new Array(A.length),M=new Array(A.length); //ガウスの消去法 for(var k=0;k<A.length-1;k++){ for(var i=k+1;i<A.length;i++){ M[i]=new Array() ; // ←ここが違うと思うのですが… M[i][k]=A[i][k]/A[k][k]; for(var j=k+1; j<A.length;j++) A[i][j]= A[i][j] - M[i][k]*A[k][j] ; b[i]=b[i]-M[i][k]*b[k]; } } //ガウスの消去法 for(var i=A.length-1;i>=0;i--){ s=0; for(var k=i+1;k<A.length;k++) s+= A[i][k]*s ; x[i]=(1/A[i][i])*(b[i]-s); } return x; }

  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

  • Javaの二次元配列についてです

    配列要素を 1, 2, 3, 4, 5 2, 2, 3, 4, 5 3, 3, 3, 4, 5 4, 4, 4, 4, 5 5, 5, 5, 5, 5 のようにしたいのですがどうすればよろしいでしょうか? int[][] a = new int[5][5]; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { ~ここの処理を教えてください~ } }

    • ベストアンサー
    • Java
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java

専門家に質問してみよう