質問: 商品リンクをランダムで指定数表示したい(重複しない乱数を取り出す回数を指定したい) 小粋空間: 商品リンクをランダムに切り替える http://www.koikikukan.com/archives/2005/11/23-235730.php 上記のエントリーを参考に、amazonの商品リンクをランダムで表示させようと試してみたのですが、上記の方法だと例えば商品をa~eまで登録していたとしても、実際ランダム表示されるのはa~eの中から1つだけになってしまいます。 これを、個数を指定してランダム表示されるようにしたい(3と指定したとすると、a~eの中からランダムに3つ商品を表示、のように)のですが、その際、指定数は決め打ちせず、簡単に変えられるようにしておきたいのです。 「重複しない乱数を取り出す」等検索してみましたが、不勉強のため類似質問から応用できず... 知識のある方、ご教授いただけないでしょうか。 よろしくお願いいたします。
回答: 知識はないのに回答してしみませんが、いろいろ方法はあるのではないでしょうか? 全体が配列に入っているとして、とりあえず思いつくのは・・・ 1)取り出したらマークをつけておく。 乱数で呼び出すときにマークがないものが出るまで繰り返す。 2)最初に、シャッフルしておく。 配列の引数回ループでまわして、適当に入れ替えを行う。 3)取り出したものをストックしておいて、新しいものを採用する前に それまでのものと比較して同じものがなければ採用する。 とか・・・ 簡易的でよければこんなのでも、一応、ランダムになるのではないでしょうか? 全体の数と使用する数となどを考慮して効率の良い方法を決めればよいかと思います。 2)の例を以下に(リロードする度に、シャッフル後の順が変わります) var m="最初:"; var a=[]; //最初は1~20をセット for (var i=0; i<20; i++){a[i]=i+1; m+=" ," + a[i];} //シャッフル for (i=0; i<20; i++){ var n=math.floor(math.random() * 20); if (i!=n) {var tmp=a[i];a[i]=a[n];a[n]=tmp;} } //結果を表示 m+="\n混合:"; for (i=0; i<20; i++){m+=" ," + a[i];} document.write(m);