50% 25% 12.5% .... な確率で出したい時
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ ソートシャッフルがいい感じになる
◆ ただしソートアルゴリズム依存なので……
◆ ただしソートアルゴリズム依存なので……
ソートのランダムがいい感じになってました
ランダムにソートをするやつです
良くないシャッフルの例で有名ですね
これの出現率を調べてみると
6 が約 50% で 5 が約 25% で 4約 が 12.5% と徐々に半分になっています
今回は 1 から 6 ですが 10 とおりでやってみても一番大きい 10 は 50% くらいで次の 9 が 25% くらいとなっていました
1 は約 0.2% になりました
すごく便利! と思ったのですが 2 つ問題があります
まず 1 つめ
配列の 1 つめ 2 つめの確率は一緒になります
50% から始めて 半分にして行って 配列数に限りがあるので仕方ないのですが
じゃなくて
になって欲しい場合は使えません
で 2 つめ
こっちのほうが致命的ともいえます
ソートのアルゴリズム次第なので ブラウザ次第といえます
昔いろいろと試して調べた分には Chrome はソートする配列のサイズに応じてアルゴリズムが変わっていて 少ないとバブルみたいなシンプルなので ある程度数があるとクイックみたいな複雑なものでした
実際にどのアルゴリズムかはっきりとはわかりませんが サイズに応じて変わってるようです
ちょっと動きを確かめるときに使う分にはいいですが ちゃんとした公開してるサービスにはしないほうがよさそうです
普通にそういうことしようと書くと少し長くなるし速度も遅くなるんですよね
function rand(){
var arr = [1,2,3,4,5,6]
return arr.sort(function(){return Math.random()-.5}).pop()
}
var arr = [1,2,3,4,5,6]
return arr.sort(function(){return Math.random()-.5}).pop()
}
ランダムにソートをするやつです
良くないシャッフルの例で有名ですね
これの出現率を調べてみると
[0.030963, 0.031377, 0.062065, 0.125618, 0.250485, 0.499492]
6 が約 50% で 5 が約 25% で 4約 が 12.5% と徐々に半分になっています
今回は 1 から 6 ですが 10 とおりでやってみても一番大きい 10 は 50% くらいで次の 9 が 25% くらいとなっていました
1 は約 0.2% になりました
すごく便利! と思ったのですが 2 つ問題があります
まず 1 つめ
配列の 1 つめ 2 つめの確率は一緒になります
50% から始めて 半分にして行って 配列数に限りがあるので仕方ないのですが
[12.5, 12.5, 25, 50]
じゃなくて
[6.6666, 13.3333, 26.6666, 53.3333]
になって欲しい場合は使えません
で 2 つめ
こっちのほうが致命的ともいえます
ソートのアルゴリズム次第なので ブラウザ次第といえます
昔いろいろと試して調べた分には Chrome はソートする配列のサイズに応じてアルゴリズムが変わっていて 少ないとバブルみたいなシンプルなので ある程度数があるとクイックみたいな複雑なものでした
実際にどのアルゴリズムかはっきりとはわかりませんが サイズに応じて変わってるようです
ちょっと動きを確かめるときに使う分にはいいですが ちゃんとした公開してるサービスにはしないほうがよさそうです
普通にそういうことしようと書くと少し長くなるし速度も遅くなるんですよね
function rand(){
var arr = [1,2,3,4,5,6]
var sep = arr.map((e,i) => Math.pow(2,i))
var val = Math.random() * sep[sep.length - 1]
return arr[sep.slice().concat(val).sort((a,b) => a - b).indexOf(val)]
}
var arr = [1,2,3,4,5,6]
var sep = arr.map((e,i) => Math.pow(2,i))
var val = Math.random() * sep[sep.length - 1]
return arr[sep.slice().concat(val).sort((a,b) => a - b).indexOf(val)]
}
[0.031027, 0.031308, 0.062284, 0.124992, 0.250029, 0.50036]