小ネタ
たまに「じゃんけんする代わりぐらいなノリでワンライナーでシャッフルしたい!
rubyのshuffle
ぐらいなやつでやりたい!でも手元にはchromeぐらいしかない!」
という事があるが、ぐぐってみると思ったほど自分にヒットするやり方が載ってなかったのでメモる。
※ ワンライナーでやるためにsort
を利用しているが、Array#sort実装のshuffleは偏る らしいので、
今回の方法はくじ引きの代わりぐらいに留めて、ちゃんとしたい場合はlodashなどのライブラリを利用するほうが良い。
やり方
["apple", "banana", "orange"].sort( () => Math.random() - 0.5)
// 一人だけ選びたいならこんな感じ
["apple", "banana", "orange"].sort( () => Math.random() - 0.5)[0]
// 複数人選びたいならこんな感じ
["apple", "banana", "orange"].sort( () => Math.random() - 0.5).splice(0,2)
sort
時にMath.random()
の返す乱数を元に true / false
をテキトーに返す。
Math.random()
はseedを設定したり出来ないので、再現性があるようなコードではないので、production利用用途とかならもうちょっと別な手法のほうが良いだろう。
手元にIEしかない!という時はarrow functionやめればいける。
["apple", "banana", "orange"].sort( function(){ return Math.random() - 0.5 })
数列をshuffleしたいならこんな感じ。魔術感出てきた。
[...Array(3).keys()].sort( () => Math.random() - 0.5)
(参考: http://rochefort.hatenablog.com/entry/2015/01/08/005043)