π λ°°μ΄μ μμλ₯Ό 무μμλ‘ μκΈ°
λ‘λ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ ν μ€νΈ μ½λλ₯Ό ꡬννκΈ° μν΄ λ°°μ΄μ μμλ₯Ό λλ€μΌλ‘ μ λ ₯λ°λ μ½λλ₯Ό ꡬννκ³ μ νλ€.
νμ§λ§ μλ°μ€ν¬λ¦½νΈλ νμ΄μ¬μ random λͺ¨λκ³Ό κ°μ λ°°μ΄μ μμλ₯Ό λλ€ ν λ°©λ²μΌλ‘ λ°κΎΈλ κΈ°λ₯μ μ 곡νμ§ μμΌλ―λ‘ λ°°μ΄μ μμλ₯Ό μκΈ° μν΄μλ κΈ°λ₯μ μ§μ ꡬνν΄μ μ¬μ©ν΄μΌ νλ€λ κ²μ μκ² λμλ€. μ΄λ₯Ό μ§μ ꡬνν΄λ³΄λλ‘ νμ!
βοΈ μλ°μ€ν¬λ¦½νΈλ‘ λ°°μ΄μ μμλ₯Ό 무μμλ‘ μμ΄λ³΄μ
μλ°μ€ν¬λ¦½νΈμμ λ°°μ΄μ 무μμλ‘ μλ λ°©λ²μ sort() λ©μλμ Math.random() λ©μλλ₯Ό μ΄μ©νμ¬ κ΅¬νν μ μλ€.
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
let arr = [1, 2, 3];
shuffle(arr);
μ μ½λλ₯Ό ν΅ν΄ κ°λ¨νκ² λ¬΄μμ ν¨μλ₯Ό ꡬνν μ μλ€.
arr λ°°μ΄μ μλμ κ°μ΄ [1, 3, 2]λ‘ λ¬΄μμλ‘ μμκ° λ³κ²½λ κ²μ νμΈν μ μλ€.
μ΄λ Math.random() - 0.5 μ κ³μ° κ²°κ³Όλ μμλ μ μ λ μ€ νλμ΄κΈ° λλ¬Έμ μ λ ¬ ν¨μλ μμλ₯Ό 무μμλ‘ μ¬ μ λ ¬ν μ μκ² νλ€.
νμ§λ§ sortλ μ΄λ° μ©λλ‘ λ§λ€μ΄μ§ λ©μλκ° μλκΈ° λλ¬Έμ μ«μ 1, 2, 3μΌλ‘ λ§λ€ μ μλ μμ΄μ΄ κ°μ λΉλλ‘ λ°μνμ§ μμ μ λ μλ€.
μμλ₯Ό ν΅ν΄ μ€μ λΉλμλ₯Ό νμΈν΄λ³΄λλ‘ νμ.
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('')]++;
}
shuffle λ©μλλ₯Ό λ°±λ§λ² μ€νμμΌ κ°λ₯ν ν λͺ¨λ κ²°κ³Όμ λΉλλ₯Ό μΈ‘μ ν΄λ³΄μ.
// λ§λ€ μ μλ λͺ¨λ μμ΄μ μμ± λΉλ μΆλ ₯
for (let key in count) {
console.log(`${key}: ${count[key]}`);
}
μ€ν κ²°κ³Όλ μμ κ°λ€. (μλ°μ€ν¬λ¦½νΈ μμ§λ§λ€ λ€λ₯Ό μ μμ)
μ€ν κ²°κ³Ό λΉλκ° νμͺ½μΌλ‘ μ§λμΉκ² νΈν₯λ μ μλ€λ κ²μ μκ² λμλ€.
μ€ν κ²°κ³Όλ μλ°μ€ν¬λ¦½νΈ μμ§λ§λ€ λ€λ₯Ό μ μμ§λ§, κΈ°μ‘΄μ μ½λλ λΉλκ° λ€λ₯Έ λ¬Έμ μ μ κ°μ§κ³ μλ€.
ν΄λΉ κ²°κ³Όμ λ°μ μμΈμ, sortλ₯Ό μ€ννμ λ λ΄λΆ λ‘μ§μΌλ‘ μΈν΄ λ°μνλ λ¬Έμ λ‘, μΆκ°μ μΈ λ°©μμ ν΅ν΄ λΉλλ₯Ό κ°κ²λ μ λνλλ‘ νμ.
βοΈ νΌμ -μμ΄μΈ μ ν(Fishcer-Yates shuffle) μκ³ λ¦¬μ¦ νμ©
νΌμ -μμ΄μΈ μ ν μκ³ λ¦¬μ¦μ λ°°μ΄ λ μμλΆν° μμν΄ μμΌλ‘ νλμ© λμκ°λ©΄μ ν΄λΉ μμ μμ μλ μμμ μμμ ν΄λΉ μμλ₯Ό λ°κΏμΉκΈ°νλ μκ³ λ¦¬μ¦μ΄λ€.
// "ꡬ쑰 λΆν΄ ν λΉ(destructuring assignment)" ver
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
// 무μμλ‘ index κ° μμ± (0 μ΄μ i λ―Έλ§)
let j = Math.floor(Math.random() * (i + 1));
[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));
// μμ λ³μμ μλ³Έ κ°μ μ μ₯νκ³ , λλ€ κ° jλ₯Ό μ¬μ©ν΄ λ°°μ¬
let t = array[i];
array[i] = array[j];
array[j] = t
}
}
μλ‘ μμ±ν ν¨μλ₯Ό μ€νν΄μ λΉλλ₯Ό μΈ‘μ ν΄λ³΄μ.
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) {
console.log(`${key}: ${count[key]}`);
}
μ€ν κ²°κ³Ό λͺ¨λ μμ΄μ΄ κ±°μ μ μ¬ν λΉλλ‘ λ§λ€μ΄ μ§κ²μ νμΈν μ μλ€.
μ΄λ‘μ¨ κΈ°μ‘΄μ ν¨μλ³΄λ€ λμ± κ³ λ₯Έ κ²°κ³Όκ°μ νλν μ μμ λΏλ§ μλλΌ νΌμ -μμ΄μΈ μκ³ λ¦¬μ¦μ ‘μ λ ¬' μ°μ°λ μκΈ° λλ¬Έμ μ±λ₯μ μ΄μ λν κ°μ§κ³ μλ€.
μ°Έκ³
'IT > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
requestAnimationFrame vs setTimeout (0) | 2022.04.08 |
---|---|
DOMContentLoaded μ΄λ²€νΈ νΈλ€λ§ (0) | 2022.04.01 |
λ¬Έμμ΄ μΉν (replace, RexExp, match) (0) | 2022.03.13 |
TypeScript vs PropTypes (0) | 2022.03.09 |
[JavaScript] nullκ³Ό undefined (0) | 2022.01.19 |
λκΈ