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 ]