アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://www.eweb-design.com/affiliate/0303_jr.html
こちらのサイトのソースを参考にランダムに複数のリンクを表示したいと考えています。
このソースだとランダムに複数のリンクを表示できたのですが、重複しないように表示ができません。
そこでいくつか調べてみたところ、重複しないようにランダムに複数表示するスクリプトを発見しましたが、あまりシンプルに作成されていないため使用するのをやめました。

やはり、重複しないという条件をつけるとスクリプトは長くなってしまうのでしょうか?
このスクリプトは諦めて他のスクリプトを試すべきなのでしょうか?
JavaScriptに詳しい方、よろしくお願いします。

A 回答 (3件)

<script>


/**************************/
/*最初にシャッフルする方法*/
/**************************/
var list = [0,1,2,3,4,5,6,7,8,9];
//Fisher-Yates shuffle
var i = list.length;
while(i > 1){
  var j = Math.floor(Math.random() * i);
  i--;
  var tmp=list[j]; list[j]=list[i]; list[i]=tmp; //Swap
}
alert(list.toString());


/*******************************/
/*1つずつランダムに取り出す方法*/
/*******************************/
function pick_random(list){
  if(list.length<=0){return;}

  //ランダムに1つ選ぶ
  var idx = Math.floor(Math.random() * list.length);
  var retVal = list[idx];

  //選んだ要素を削除(splice使って削除してもよい)
  list[idx] = list[list.length-1];
  list.length--;

  return retVal;
}
list = [0,1,2,3,4,5,6,7,8,9];
var shuffle_list = [];
for(i=list.length;i>0;i--){
  shuffle_list.push( pick_random(list) );
}
alert(shuffle_list.toString());
</script>



> var j=Math.floor(Math.random() * 20);
> var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
この方法、実は要素数が3以上の時は全ての組み合わせが等確率で出現しません。
例えば要素数が3の時は、
4/27の確率で出現する組み合わせと、5/27の確率で出現する組み合わせが存在します。

//確認用コード
<script>
var dist = {};
for (var n=0;n<27000;n++){
  var h=[0,1,2];
  for (var i=0; i<3; i++){
    var j=Math.floor(Math.random() * 3);
    var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
  }
  dist[h.toString()] = (dist[h.toString()]||0) + 1;
}
var message = "";
for(var pattern in dist){
  message += pattern + ":" + dist[pattern] + "\n";
}
alert(message);
</script>
    • good
    • 0
この回答へのお礼

解説付きのサンプルでありがたいです。
ですが、このサンプルを改良する技術を持っていないので、初心者サイトを参考に改良していきたいと思います。

お礼日時:2009/04/04 19:38

かき混ぜるほうの一例


頭から必要な数だけ取り出せばよいです。

<html>
<<script type="text/javascript">
var h=[];
for (var i=0; i<20; i++) h[i]=i+1;
document.writeln('シャッフル前:' + h.toString());

for (i=0; i<20; i++){
var j=Math.floor(Math.random() * 20);
var tmp=h[j]; h[j]=h[i]; h[i]=tmp;
}

document.writeln('<p>シャッフル後:' + h.toString());
</script>
</html>
    • good
    • 0
この回答へのお礼

具体的な例を出していただき、ありがとうございます。
数字のランダムとテキスト(リンク)のランダムでは書き方が異なるのでしょうか?
無知で申し訳ないです。

お礼日時:2009/04/04 19:31

その場合はリストから「引っこ抜く」(配列の内容が減っていく)方法か、リストをとりあえずかき混ぜてから必要な数だけ順番に取り出すってのが妥当じゃないかな。

    • good
    • 0
この回答へのお礼

なるほど。
当方、JavaScriptの知識がないので、この回答と初心者サイトを参考にしながら頑張ってみようと思います。

お礼日時:2009/04/04 19:27

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