• ベストアンサー

配列変数に重複のないランダムな数字を入れて行くには?

JavaScript初心者です。 配列にランダムな数字を入れたいのですが、 aRnd = new Array(); aRnd[0] = Math.floor(Math.random()*100); aRnd[1] = Math.floor(Math.random()*100); aRnd[2] = Math.floor(Math.random()*100); のようにやると各配列にはランダムな数字が入りますが、重複が発生する可能性があります。これを重複が発生しないようにしたいのですが、どのようにすればいいのでしょうか? なお、上記例では0~99までの数字を3つの配列にセットする方法となっていますが、配列数や数字の最大値は変更する可能性があるので、これも配慮したいと思います。 よろしくお願いいたします。

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

  • ベストアンサー
  • fandame
  • ベストアンサー率27% (23/84)
回答No.2

アルゴリズム的なアドバイスしかできませんが、参考になればと思います。 値をaRnd[n]に入れた後に、aRnd[0]~aRnd[n-1]とanRnd[n]を比較していきます(IFとかforを使う)。 同じ値が見つかった場合、nを-1してもう一度実行しなおせばいけます。

starship51
質問者

お礼

ありがとうございました。No1さんのアドバイスと合わせて考えてみたところ、うまくいきました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3>this.data = new Array(100); は、 this.data = new Array(n); の間違いorz

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

function FixedRand(n){ this.data = new Array(100); for(var i=0;i<n;i++){ this.data[i]=i; } } FixedRand.prototype.Next = function(){ var size = this.data.length; if(size == 0) return Number.NaN; var pos = Math.floor(size*Math.random()); var wk = this.data[size-1]; this.data[size-1]=this.data[pos]; this.data[pos]=wk; return this.data.pop(); } var FR = new FixedRand(100); aRnd = new Array(); aRnd[0] = FR.Next(); aRnd[1] = FR.Next(); aRnd[2] = FR.Next();

starship51
質問者

お礼

ありがとうございました。こちらは関数を使う方法ですね。JavaScript初心者の私には高度すぎて、理解できない部分がありますが、勉強のためにこちらも参考にさせていただきます。

noname#20377
noname#20377
回答No.1

俺はJavascript書ける人間じゃないので文法がそもそもなってないかもしれない(実際に動作確認してない) n = 2; a = -1; b = 0; i = 0 while(i<n+1) { a = Math.floor(Math.random()*100); for(j= 1;j>i;j++;) { if(a == aRnd[j]){ b = 1; } } if(b==0){ aRnd[i] = a; a = -1; b = 0; i=i+1; } }

starship51
質問者

お礼

ありがとうございました。No2さんのアドバイスと合わせて考えてみたところ、うまくいきました。