ë°°ì´ ìì 무ììë¡ ì기
ë°°ì´ì ìì를 무ììë¡ ìì´ì£¼ë í¨ì shuffle(array)ì ìì±í´ ë³´ì¸ì.
shuffleì ì¬ë¬ ë² ì¤ííë©´ ììì ì ë ¬ ììê° ë¬ë¼ì¼ í©ëë¤. ìì를 ì´í´ë´
ìë¤.
let arr = [1, 2, 3];
shuffle(arr);
// arr = [3, 2, 1]
shuffle(arr);
// arr = [2, 1, 3]
shuffle(arr);
// arr = [3, 1, 2]
// ...
문ì 를 í ë 주ìí ì ì 모ë ìì´ì´ ëì¼í íë¥ ë¡ ì¼ì´ëì¼ íë¤ë ì ì
ëë¤. ì를 ë¤ì´ [1,2,3] ì [1,2,3]ì´ë [1,3,2], [3,1,2]ë¡ ì¬ì ë ¬ ë ì ìëë°, ì´ ë°°ì´ë¤ì´ ë§ë¤ì´ì§ë ë¹ëë ê°ìì¼ í©ëë¤.
ê°ë¨í í´ê²°ì± ì ìëì ê°ìµëë¤.
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
let arr = [1, 2, 3];
shuffle(arr);
alert(arr);
Math.random() - 0.5ì ê³ì° ê²°ê³¼ë ììë ìì ë ì¤ íëì´ê¸° ë문ì ì ë ¬ í¨ìë ìì를 무ììë¡ ì¬ ì ë ¬í´ì¤ëë¤.
ê·¸ë°ë° sortë ì´ë° ì©ëë¡ ë§ë¤ì´ì§ ë©ìëê° ìë기 ë문ì ìì ê°ì´ ëµìì ìì±íë©´ ì«ì 1ê³¼ 2, 3ì¼ë¡ ë§ë¤ ì ìë ìì´ì´ ê°ì ë¹ëë¡ ëíëì§ ììµëë¤.
ìì를 ì´ì©í´ ì´ë¥¼ ì´í´ë´
ìë¤. ìë ì½ëë í¨ì shuffleì ë°±ë§ ë² ì¤íìí¤ê³ ê°ë¥í í 모ë ê²°ê³¼ì ë¹ë를 ì¸ì¤ëë¤.
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
// 1, 2, 3ì¼ë¡ ë§ë¤ ì ìë 모ë ìì´ì ë¹ë를 ì¸ì¤ëë¤.
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for (let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
shuffle(array);
count[array.join('')]++;
}
// ë§ë¤ ì ìë 모ë ìì´ì ìì± ë¹ë를 ì¸ì ì¶ë ¥í´ì¤ëë¤.
for (let key in count) {
alert(`${key}: ${count[key]}`);
}
ì ì½ë를 ì¤ííë©´ ìëì ì ì¬í ê²°ê³¼ê° ëì¶ë©ëë¤(ìë°ì¤í¬ë¦½í¸ ìì§ë§ë¤ ë¤ë¥¼ ì ììµëë¤).
123: 250706
132: 124425
213: 249618
231: 124880
312: 125148
321: 125223
123ê³¼ 213ì´ ëíëë ë¹ëê° ëì ê²ì¼ë¡ ë³´ì 기존 ì½ë를 ì´ì©íë©´ ê²°ê³¼ê° í쪽ì¼ë¡ ì 릴 ì ìë¤ë ê²ì ì ì ììµëë¤.
ì¤í ê²°ê³¼ë ìë°ì¤í¬ë¦½í¸ ìì§ë§ë¤ ë¤ë¥´ê² ì§ë§, 기존 ì½ëë 문ì ìì ì ìí ì¡°ê±´ì ë§ì¡±íì§ ëª»íë¤ë ì¬ì¤ì ìê² ëììµëë¤.
ì ì ì½ëë ìëí ëë¡ ëìíì§ ìë 걸ê¹ì? ê·¸ ì´ì ë sort를 ì¤ííì ë ë´ë¶ ëìì´ ë¸ëë°ì¤ ìì ë´ê²¨ì기 ë문ì
ëë¤. sort를 ì¤ííë©´ ì¸ìë¡ ë긴 ì ë ¬ í¨ìê° ë°°ì´ì ì 리í´ì£¼ëë° ì´ ê³¼ì ìì ë°°ì´ ììë¼ë¦¬ì ë¹êµê° ìì 무ììë¡ ì´ë¤ì§ê¸° ë문ì ë¸ëë°ì¤ ìì 무ìì´ ë´ê²¨ììì§ë ë ì측í기 ì´ë ¤ìì§ëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ë§ë¤ ë´ë¶ 구íë°©ìì´ ë¤ë¥´ë¯ë¡ ì´ë° í¼ëì ë 커ì§ì£ .
ì´ë° 문ì ë ë¤ìí ë°©ë²ì¼ë¡ í´ê²°í ì ìëë° í¼ì -ìì´ì¸ ì í(Fisher-Yates shuffle) ìê³ ë¦¬ì¦ì ì´ ì¤ íëì ëë¤. í¼ì -ìì´ì¸ ì í ìê³ ë¦¬ì¦ì ë°°ì´ ë ììë¶í° ììí´ ìì¼ë¡ íëì© ëìê°ë©´ì í´ë¹ ìì ìì ìë ììì ììì í´ë¹ ìì를 ë°ê¿ì¹ê¸°íë ìê³ ë¦¬ì¦ì ëë¤.
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1)); // 무ìì ì¸ë±ì¤(0 ì´ì i 미ë§)
// array[i]ì array[j]를 ë°ê¿ì¹ê¸°í©ëë¤.
// ìë ëµììì "구조 ë¶í´ í ë¹(destructuring assignment)"ì´ë¼ ë¶ë¦¬ë 문ë²ì ì¬ì©íì¬
// ìíë ê²ì 구ííìëë°,
// ì´ ë¬¸ë²ì ëí ìì¸í ë´ì©ì ì´í ì±í°ìì ë¤ë£° ìì ì
ëë¤.
// 구조 ë¶í´ í ë¹ì ì¬ì©íì§ ìê³ ìì±í ì½ëë ìëì ê°ìµëë¤.
// let t = array[i]; array[i] = array[j]; array[j] = t
[array[i], array[j]] = [array[j], array[i]];
}
}
ì ì´ì ìë¡ê² ìì±í í¨ì를 ê°ì§ê³ ì¤íí´ ë´ ìë¤.
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
// 1, 2, 3ì¼ë¡ ë§ë¤ ì ìë 모ë ìì´ì ë¹ë를 ì¸ì¤ëë¤.
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for (let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
shuffle(array);
count[array.join('')]++;
}
// ë§ë¤ ì ìë 모ë ìì´ì ìì± ë¹ë를 ì¸ì ì¶ë ¥í´ì¤ëë¤.
for (let key in count) {
alert(`${key}: ${count[key]}`);
}
ì¤í ê²°ê³¼ë ìëì ê°ìµëë¤.
123: 166693
132: 166647
213: 166628
231: 167517
312: 166199
321: 166316
모ë ìì´ì´ ê±°ì ì ì¬í ë¹ëë¡ ë§ë¤ì´ì§ ê²ì íì¸í´ ë³´ììµëë¤.
í¼ì -ìì´ì¸ ìê³ ë¦¬ì¦ì âì ë ¬â ì°ì°ë ì기 ë문ì ì±ë¥ì ì´ì ë ììµëë¤.
