【メモ】重複しない乱数配列を作る

user-pic
for(i = 0 ; i < length ; i++){
   array[i] = Math.floor(Math.random()*30);
}
//length:配列の要素数
 これだけでは配列に重複した値が入ってしまう可能性があります。  Actionscriptで書いてますが、C言語でもJAVAでもほぼ一緒です。  重複しないようにするには…。
for(i = 0 ; i < length ; i++){
   array[i] = Math.floor(Math.random()*30);
   for(j = 0;j < length; j++){
      if(j != i){
         if(array[i] == array[j]){
            i--;
         }
      }
   }
}
 乱数を発生させた後、自分自身以外と比較して同じものがあれば i を1引いてもう一度乱数を発生という感じです。
 30を変えると乱数の範囲を変えられます。ただし、配列の要素数未満にすると無限ループになります。
 いろいろぐぐってたんですが、方法としてもっとややこしい仕組みになっていたりわかりにくかったので調べるのを諦めて自分で考えました。

コメント(2)

| コメントする
user-pic

逆の発想で、1〜iの値をarray[i]にランダムに割り振っていくというアルゴリズムではどうでしょう?
割り振り箇所にすでに格納されていた場合にはシフトするなり再割り振りを試行するなりのルールを組んで衝突回避を盛り込んでおけばカードを切る程度のことはできると思います。
乱数の範囲を1〜iにしたくないのであればこの方法は使えませんが。
#ついでに実行速度度外視なのが悲しいところです…

user-pic

 そうですね。この方法ですと総当りで比較するわけですから要素数が多ければ多いほど時間がかかってしまいます。
 hogehogeさんの方法の方が手数は少なく済みそうですね。別の方法も考えてみます。

コメントする

[過去ログ]

カテゴリ