気まぐれな配列 push

データを配列に追加する時に、わざと「漏れ」を生じさせる、ということを考えてみました。

function push_or_not(ary, v) {
  (Math.random() <= 0.5) && ary.push(v);
}

およそ半分の確率で漏れます。

さらに漏れ具合をランダムにしてみましょう:

function push_or_not2(ary) { // カリー化
  var x = Math.random();
  return function(v) {
    (Math.random() <= x) && ary.push(v);
  };
}

大量のデータから適当にピックアップしたい、とか、取得漏れが生じても構わない、といった場合に使えるんじゃないかと思います。

例 1 (with Mochikit):

var ary = [];
forEach(
  large_list,
  push_or_not2(ary)
);

例 2 (ランダムなリンク抽出):

var ary = [];
var pon = push_or_not2(ary);
responseText.replace(/<a href="(.+?)"/g, function(_, $1) {
  pon($1);
});


追記 [20070322]:

配列からランダムにピックアップする場合は filter 関数を使った方が良いですね (LDR のフィード一覧をこの方法でフィルターしようと考えていて気付きました)。

function true_or_not() {
  return (Math.random() <= 0.5);
}
newary = filter(true_or_not, ary);

function true_or_not2() {
  var x = Math.random();
  return function() {
    return (Math.random() <= x);
  };
}
newary = filter(true_or_not2(), ary);