牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Javascript で Loto6 の数字をランダムに取得してみるメモ

Python での例

from random import sample
print(sorted(sample(range(1, 44), 6)))
# ex -> [14, 15, 31, 33, 40, 41]

Javascript で書いてみる

function range(start, end) {
  var numbers = [];
  if (!end) {
    end = start;
    start = 0;
  }
  for (var i = start; i < end; i++) {
    numbers.push(i);
  }
  return numbers;
}

// function random_sample(population, k) {
//   var numbers = [];
//   for (var num = 1; num <= k; num++) {
//     var pickup_num = Math.floor(Math.random() * population.length);
//     numbers.push(population.splice(pickup_num, 1)[0]);
//   }
//   return numbers;
// }
// fixv0.2
function random_sample(population, k) {
  var num,
      begin,
      temp_arr = population.slice(0),
      numbers = [];
  for (num = 1; num <= k; num++) {
    begin = Math.floor(Math.random() * temp_arr.length);
    numbers.push(temp_arr.splice(begin, 1)[0]);
  }
  return numbers;
}

function orderByInt(a, b) {
  return a -b;
}

console.log(random_sample(range(1, 44), 6).sort(orderByInt));
// ex -> [ 3, 22, 24, 26, 34, 43 ]

冗長になっちゃった。どれくら簡潔にかけるんだろ?
修正
Javascript よくわからんなあ(´・ω・`)

別の書き方

id:yohfee さんにコメント頂いた
(ありがとうございます)

// 再帰よくわからんです\(^o^)/
// 引数検証しないと無間地獄で死ぬ
// 1行で書けるっちゃ書けるけどヤバイ
function range(start, end) {
  if (end) {
    if (start === end) {
      return [];
    } else {
      return [start].concat(range(start + 1, end));
    }
  } else {
    return range(0, start);
  }

  // return end ? start == end ? [] : [start].concat(range(start + 1, end)) : range(0, start);
}

// es5使っちゃえー
// 元のやつでpopulation.spliceしてるの破壊的なので個人的にはアレです
// range大活躍!!
function random_sample(population, k) {
  var indices = range(population.length);

  return range(k).map(function () {
    var index = Math.floor(Math.random() * indices.length),
        sample = indices.splice(index, 1)[0];
    return population[sample];
  });
}

追記 2022-08-08

console.info([...Array(44).keys()].slice(1).sort(()=> Math.random() - 0.5).slice(0, 6).sort())
//-> [ 16, 18, 28, 30, 32, 35 ]