jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

JavaScriptを利用してリスト要素の順序をランダム化

前にR言語を利用してリスト要素の順序をランダム化というのをやりました。

今回は同じことをJavaScriptでやってみます。

やり方その1: 任意の二つの要素を並べ替える

配列の中から適当に2つの要素を選び、その要素を入れ替えます。これを何回も繰り返して、要素がばらばらの順序になることを目指します。

//最初の配列
var ori = [1,2,3,4,5,6,7,8,9,10];

function randomReplace(arr){
  var replacePoint1 = Math.floor(Math.random() * arr.length);
  var replaceValue1 = arr[replacePoint1];

  var replacePoint2 = Math.floor(Math.random() * arr.length);
  var replaceValue2 = arr[replacePoint2];

  arr[replacePoint1] = replaceValue2;
  arr[replacePoint2] = replaceValue1;

  //途中経過を見たい場合は次の行のコメントアウトをはずす
 //console.log("now " + arr);

  return arr;
}

var numberShuffle = 100;

for (var i = 0; i < numberShuffle; i += 1){
 ori = randomReplace(ori);
}

やり方その2: 連想配列の要素にランダムな数値を割り当ててソートする

一要素のみをオブジェクトとして持つ連想配列からスタートします。少し手続きが複雑なのですが、大きく分けて3つのプロセスからなります。

連想配列にランダムな数字を持つ要素を追加
//元の連想配列

var oriJS = [{val:1},{val:2},{val:3},{val:4},{val:5},{val:6},{val:7},{val:8},{val:9},{val:10}];

for (var i = 0; i < oriJS.length; i += 1){
  oriJS[i].random = Math.random();
}
ランダムな数字を基準に配列をソート
oriJS.sort(function(a,b){
  if(a.random < b.random){
    return -1;
  } else {
    return 1;
  }
  
});
連想配列から最初の要素のみを抽出
var ansarr = new Array();
for (var j = 0;j < oriJS.length;j += 1){
  ansarr.push(oriJS[j].val);
}

以上の3つを組み合わせると、ansarrという配列にランダムに並べ替えられた要素が保存されます。