• ベストアンサー

1から20までの整数から、重複なくランダムに3つ数づつを取り出す

1から20までの整数から、重複なくランダムに3つの数を取り出したいんですけど、簡単に出来るのでしょうか ?

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

高級言語は配列のランダム機能があったり するのでみなさんローレベルのランダム化 にはなれていないのでしょうか? 残念ながらみなさんのコーディングには 問題があります。 重複したら、リトライするという方式は 一番してはいけない方法です。 1000個の要素から1000個抜き出すときに、 999番目の要素は約0.1%の確率でしか重複 しない数値がヒットしません。 要素数が増えると加速度的に時間のかかる プログラムです。 また#4さんのように、適当な回数要素数 の中で入れ替えをするというの、よさそうに 見えますが、初期要素からいれかわらない 可能性が強く、かなり偏りがでるランダム です。 そもそも3つの要素を抜き出すのであれば ランダム処理は3回やればじゅうぶんのはずです。 以下の例はざっとかいたものなのでバグがある かもしれませんがランダム化のフローを 理解いただく参考までに。 <script language="javascript"> function rndview(min,max,num){ var a=new Array(); for (var i=min;i<=max;i++){ a[i]=i; } for (var i=min;i<=(min+num-1);i++){ var p1 = i+Math.floor(Math.random() * (max-i+1)); var p2 = a[i]; a[i]=a[p1]; a[p1]=p2; } txt=""; for (var i=min;i<=(min+num-1);i++){ txt+=(txt=="")?a[i]:","+a[i]; } alert(txt); } </script> <input type="button" value="ランダム" onClick="rndview(1,20,3)">

その他の回答 (12)

  • Jodie0625
  • ベストアンサー率30% (397/1288)
回答No.2

#1です。 肝心なことを忘れてました。 #1の回答のままですと、小数部が残りますし、単純に切り上げをするのも間違いです。 Math.round((20*Math.random() + 0.5) で、 0.5以上20.5未満の数を四捨五入するようにします。

  • Jodie0625
  • ベストアンサー率30% (397/1288)
回答No.1

Math.random()を使うと、0以上1未満の乱数が生成できます。 これを使って、 20*Math.random() とすると、0以上20未満になります。 20も含めたいので、これに1を足します。 20*Math.random() +1 これで出てきた数字を変数に入れておき、もう一回この関数を呼び出し、変数に入っている数が出てきたらもう一回呼び出します。 ユニークな乱数が3つ生成されたら、完了です。 コードは工夫してみてください。