-
for / indexOf아리스봇/삽질로그 2022. 4. 29. 19:48
흔히 배열 내의 특정 값을 찾을 때 for 반복문이나 indexOf를 씁니다.
저는 Math.random()으로 배열에서 값을 랜덤하게 뽑아줄 때 주로 씁니다.예를 들어서 아리스봇의 블랙잭 기능에서는 실제로 위와 같이 52개의 카드가 들어있는 덱을 사용해서,
selected = deck[Math.floor(Math.random() * (deck.length - 1))] for (let i = 0; i < deck.length; i++) { if (deck[i] === selected) { item.push(deck[i]); deck.splice(i, 1) } }
이런 식으로 카드를 뽑아냅니다.
따라서 덱의 마지막 카드가 집히면 52번의 루프를 돌아야 하는 만큼 조금이라도 효율적인 방법을 사용해야 하는 관계로, for 반복문과 indexOf의 속도를 비교해보고 사용했습니다.
결론만 이야기하면 for 반복문이 indexOf보다 조금 빨랐습니다. 살짝 체감이 되는 정도로요.
아마 indexOf에는 매번 자잘한 연산이 더 들어가서 그런 것 같습니다.
코드 길이를 줄이고자 한다면 indexOf를 쓰겠지만, 그렇지 않다면야 반복문을 쓰는 편이 나을 것 같네요.
꼭 짧은 코드가 더 효율적으로 실행된다는 법은 없으니까요.
+ 루프 속도 자체는 덱을 스페이드, 다이아, 하트, 클럽으로 나눈 뒤 1/4 1/13 으로 서치를 시키면 훠어어어얼씬 빨라지기는 합니다만, 그러면 최초 시행 이후로는 확률분포가 동일하지 않게 되니 그 방법은 사용하지 않고 있습니다.
++시간이 나면 deck 객체에 각각 number를 각각 부여해서 반복문 없이 바로 뽑아내게 시킬까 싶습니다.
deck[i]에 대해서 push하고 (deck[i].number, 1)을 splice하면 될 것 같네요.
아니다 이거 최초 시행 후에 배열 넘버가 바뀌니까 못 쓰는 방법임
차라리 위에서 말한 것처럼 덱을 스/다/하/클 로 나누고 덱 매수만큼 가중치를 둬서 random 돌리는 편이 나을 것 같음. 그러면 진짜 랜덤 맞음'아리스봇 > 삽질로그' 카테고리의 다른 글
TypeError: Cannot read properties of undefined (reading '_add') (0) 2022.05.28 0430 삽질로그 (0) 2022.04.30 twit 에러 핸들링 (0) 2022.04.13 0408 삽질로그 (0) 2022.04.08 22-04-05 (0) 2022.04.05