電子書籍の厳選無料作品が豊富!

windows2000
Flash MX

1~9までの数字をランダムに発生させ配列に入れるには

v_count=new Array();

for(i=1; i<10; i++) {
  v_max=9
  v_count[i]=Math.floor(Math.random()*v_max)+1  }

と記述しました。
配列に格納されたランダムに発生した数字が9個ありますが当然同じ数字も含まれています。
これを数字が重複しないようにする方法が知りたいのです。
つまり1~9までの数字をランダムに並べ替えたいのですがどのような方法がありますか。教えて下さい。

説明が下手でスミマセン。
ご指摘いただければ補足します。

A 回答 (3件)

基本的には、予め配列に1~9の数字を入れておいて、この配列を並び替えることで、重複する数字のないランダムな数列を作れます。


並び替える方法は様々ですが、簡単なところで次のような考え方はいかがでしょう。

配列のインデックス値は0から始まります。配列の要素が9つであれば、インデックス値は0~8です。
0~8の間で乱数を2つ作ります。これをインデックス値として指定して、配列の要素をランダムに2つ選択し、この2つの値を互いに入れ換えます。
この作業を好きなだけ繰り返すと、ランダムな並びになります。
変数は新しい値を入れると、入っていた値は上書きされて消えてしまいます。入れ換える時には、もう1つ変数を用意して、どちらかの値を保存しておきましょう。

シャッフルの回数は多いほどいいというわけでもありませんが、さしあたって 30 回ほど繰り返すとすると、大体のスクリプトは次のようになるかと思います。
(↓このスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)


 //変数と配列を用意する
 var i , temp , rnd1 , rnd2 ;
 v_count = new Array() ;

 //配列に1~9を入れる
 for ( i = 0 ; i < 9 ; i++ )
 {
  v_count[ i ] = i + 1 ;
 }

 //シャッフルを30回実行
 for ( i = 1 ; i <= 30 ; i++ )
 {
  //1つめの要素を選択
  rnd1 = Math.floor( Math.random() * ( 8 - 0 + 1 ) ) + 0 ;
  //2つめの要素を選択
  rnd2 = Math.floor( Math.random() * ( 8 - 0 + 1 ) ) + 0 ;

  //1つめの値を作業用変数に保存
  temp = _root.v_count[ rnd1 ];

  //2つの値を入れ換える
  _root.v_count[ rnd1 ] = _root.v_count[ rnd2 ] ;
  _root.v_count[ rnd2 ] = temp;
 }


処理の上ではあまりスマートとは言えませんが、単純なスクリプトでできる、簡単な方法です。
よろしければ、ご参考までに。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
成る程こんな方法もあったんですね。
たいへん勉強になりました。
そして早速利用さしていただきます。

お礼日時:2004/06/16 20:56

最初の方のやり方でもよいのですが、配列の要素を入れ替える回数が多くなってしまうし、乱数の出方が悪いとうまくランダムに並べ変わらないので、次のやり方のほうがよいと思います。



1. 配列の要素を1~9でそれぞれ初期化する。
2. 1~9の乱数Rを取り出し、R番目と9番目の要素を入れ替える。
3. 1~8の乱数Rを取り出し、R番目と8番目の要素を入れ替える。
4. 1~7の乱数Rを取り出し、R番目と7番目の要素を入れ替える。
(中略)
9. 1~2の乱数Rを取り出し、R番目と2番目の要素を入れ替える。

この方法だとわずか8回の入れ替えで完全にランダムな数列を作れます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼の返事が遅くなりごめんなさい。

たいへん勉強になりました。
さっそく利用しています。

お礼日時:2004/06/10 06:14

言葉で説明させていただきます。


1.配列1から9に初期値で1~9を入れます。
2.乱数を引いて1~9の数字を取り出します。これをRとします。
3.配列のR番目と9番目を入れ替えます。
4.これを多数回繰り返せばお望みの乱数が得られます。

これを何度かやる時に同じ結果が出た方がいいのか、出たら困るのかで、ちょっと工夫が要ります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼の返事が遅くなりごめんなさい。

たいへん勉強になりました。

お礼日時:2004/06/10 06:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!