rand(life)

무작위로 영어->한국어, 한국어->영어 단어시험지 추출 본문

컴퓨터/엑셀

무작위로 영어->한국어, 한국어->영어 단어시험지 추출

flogsta 2017. 2. 16. 10:37

이렇게 단어시험 문제를 낸다고 합시다. 

시험범위는 B1~D1이고

총 시험문항수는 D4

우리말 뜻쓰기 유형 문항수는 C3

영어철자쓰기 유형 문항수는 C4

무작위로 저 조건에 맞게 단어를 추출하려면 어떻게 해야할까요?

대개 이런 유형의 문제들은 배열함수가 답입니다.


편의상 4번 문항의 수식을 예로 들겠습니다.

B13에 들어가는 수식은 위와 같습니다. 배열수식이므로 마지막에 Ctrl-Shift-Enter입니다

수식의 각 부분의 해석은 다음과 같습니다.


수식

해석

기능(함수)

=IF($A13<=$D$4,

문항번호가 총문항수보다 적거나 같으면 이후 수식 진행, 아니면 공백출력

 

OFFSET

 

위치 이동 함수

(IF($A13<=$C$3,LIST!$C$1,LIST!$D$1),

미리 정해진 영어->한국어 문항수보다 문항번호가 작을 때, list시트의 C(영어) 첫행 선택. 아니면 D(한국어) 첫행 선택

offset함수의 인수. 이 위치에서 특정 거리만큼 이동함.

MOD

나머지의 크기에 따라 문항번호에 해당하는 순서의 단어의 위치를 구함

나머지 구하기

(SMALL

조건에 맞는 단어들 중 몇 번째로 작은 수에 해당하는 순위를 가진 단어를 찾음

배열함수에서 크기순으로 나열하기 위해 자주 쓰는 함수. 배열 중 몇 번째로 작은 수를 찾는다.

(IF(IFERROR

시험범위에 해당하는 단어 배열만듬

배열이 시작됨

((SUBSTITUTE(LIST!$A$2:$A$99,"day","")*1>=$B$1)*

단어 목록 중 시험범위에 해당하는 단어들의 번호만 배열로 출력함.

day1->1, day2-> 2....

B1은 시험범위 시작일

배열1

(SUBSTITUTE(LIST!$A$2:$A$99,"day","")*1<=$D$1)

D1은 시험범위 마지막일. 두 개의 substitute 함수는 논리곱*으로 연결되어있어, 둘 다 TRUE이여야만 값이 출력되고 그렇지 않으면 FALSE0으로 취급

배열2

,0),

오류값이 있으면(즉 시험범위가 되는 날짜에 해당하지 않는 단어이면) 0을 출력

iferror함수의 인수

LIST!$G$2:$G$99*10^5+ROW($G$2:$G$99)),

list시트에서 단어마다 rand()함수로 동순위 없는 순위를 매겨둠.(G2:G99) 시험범위에 해당하는 단어들의 번호에 대해서는 그 순위에 10,000을 곱하고(단어수가 2~99보다 더 많아지면 간섭을 받을 수 있으므로) 2~99까지의 숫자와 더해줌. 2~99의 숫자는 list시트 상에서 해당 단어의 위치를 나타내므로, 실질적으로는 단어를 골라내는 역할을 함

IF구문의 결과값

$A13)

위의 계산 결과로 나온 단어의 순위*10,000+(2~99)한 배열 중에서 작은 순서대로 문항번호만큼인 숫자(예를 들어, 문항번호가 4번이라면 4번째로 작은수)를 고른다. 실질적으로는 rand()함수로 정해둔 단어의 순위상으로 4번째에 해당하는 수를 고른다.

SMALL 함수의 인수.

,10^5)

위의 결과값을 10,000으로 나눈 나머지를 구한다. , 위에서 더해주었던 2~99의 숫자와 같다. , list시트 상에서 해당 단어의 위치를 알려준다.

MOD함수의 인수.

-1,)

머리말, 항목의 제목 때문에 이동할 위치를 수정한다.

Offset함수의 인수.

,"")

문항번호가 총문항수보다 크면 공백출력

IF함수의 인수


설명 중간에 나오는 rand()함수로 순위를 매긴 것은 위와 같은 모습입니다. F열에는 =rand() 함수를 입력하였고, F열의 값으로 순위를 매긴 것이 G열입니다. rand()함수는 0에서 1사이의 숫자를 만들어내는데, 최대 소수점 17자리까지의 숫자를 무작위로 만들어내므로, 무작위로 번호를 부여할 때 많이 쓰는 방법입니다.


첨부화일도 있으니 각자 연구해보시길.

출처: 네이버지식인