1 ~ 45 사이의 난수를 10개를 생성 하여 배열에 저장한다. 단 겹치는 수가 있으면 안된다.
3가지 생각이 들었다
1.
i = 0~9까지 돌리면서
한 번 돌릴때마다 i이하의 모든 인덱스의 값들이 새로 만든 난수와 같은지 체크한다.
만일 같다면 난수를 다시 생성한다.
다르다면 난수를 저장한다.
2.
일단 겹치든 말든 1 ~ 45 사이의 정수를 10개를 생성 하여 배열에 저장한다.
그리고 생성된 배열에서 겹치는 애를 안겹치게 바꾼다.
3.
0~45를 담는 배열을 선언한 다음 arr[46] = { 0, 1, 2, 3, .... 45 };
0~45사이의 난수 생성을 10번 돌린다.
한번 뽑은 인덱스 값에는 0을 채운다.
arr[생성한 난수] == 0이면 다시 난수를 생성한다.
arr[생성한 난수] != 0이면 resultArr[10]에 넣는다.
저는 3번이 꼴립니다.
왜 그렇게 어렵게 하나요? [*1..45].sample(10) 이렇게 하면 되는데...
http://ideone.com/ggsqXm
C로 하는대요 부들부들
일단 1~45까지의 값을 가지고 있는다..1~45까지 컨테이너 순서를 랜덤하게 바꾼다(정렬을 이용)...그중에 앞에서 10개를 뺀다.끝..
저거 하는애들 보면 백프로다 저렇게 어디에다가 저장하고 비교하고 하면서 정작 정렬은 죽어도 안씀..정렬이 특정수로 순서를 정하면서 랜덤으로 순서를 정한다는 생각을 왜 안하지..
백수/최악의 해결책같은데양 메모리는 메모리대로 추가로 필요하고 셔플 비용도 상당한데..
3번에 0~45 아닌가요?
나도 백수님 방식으로 구현한다. 저게 일반적으로 구현하기 깔끔하고 괜찮은 방법이지. 10개의 값을 하나씩 채울 때마다 배열에 있는지 확인하려면 최악의 경우에 이미 존재하는 값만 계속 나오면 실행 시간이 어떻겠냐?
백수// 이 경우엔 정렬 함수를 따로 만들어야함. C 과제니까.. 물론 또 한가지 방법이겠네요.
1~45가 아니고 1~10000 이면
NoOTL// 맞네요 수정함
ㄴ 쌍권총으로 싸대기 맞는 부분
(재빨리 문제를 수정함)
1~45, 1~44,...1~36까지 한 뒤에
겹치는 수가 있으면 1씩 증가시키기
45개 만들고 0~44 랜덤값 인덱스 이용 셔플 한 45번 하고 앞에 10개 빼면 되지 그러면 90번밖에 더 하냐
화르르륵 불타오른다 프갤
근데 첫댓글같은거도 내부루틴은 다 본문내용처럼 생각해서 만들어야되는거 아니에요? - DCW
ㄴ 첫댓글 같은 건 구구단 외우듯이 함수를 외우고 있어야 가능한 것 같습니다.
아니 프론트유저 입장의 프로그래머로서는 본문의 고민이 쓸데없는거처럼 느껴지겠지만 좀 더 깊게 하려면 가치있는고민 아닌가효 - DCW
근데 저런 거 성능을 어떻게 따져야 함? 물론 1번은 삼중 for문이 생기는 거 같긴 하지만...
난수알고리즘은 알고리즘이 아니지않아요? - DCW
의도와 다르면 알고리즘이 아닌가요?
모르겠음. 아몰랑! 알고리즘 과목 배우면 성능계산이 머릿속에서 되려나?
유한번의 연산으로 정해진 답을 구하는 방법이라는 정의에 어긋나잖아요 - DCW
bigO도 못쓰지않음? - DCW
45라고 특정했지만 이게 N 스케일로 커질 경우의 시간복잡도를 왜 못 구하냐
1번같은경우는 난수생성이 100%운이잖아요 - DCW
알알못이니까 친절한설명 부탁드림 - DCW
저두요 알알못 2
난수 알고리즘이라고 하셔서 rand() 이거 생각했네요;;;
? 님도 최악의 경우 어떻게 되겠냐? 하셨고 최악의 경우엔 끝이 안 나겠네요
최악의 경우 끝이 안남 ㅋㅋㅋ
bogosort 같은 비결정론적 알고리즘은 big O로 나타내기 힘듬
ㅂㅋㄹ 픽 공유 사.요~나^라@티비로~
사다리 달팽이 합작 단ㅌ 초대 tocara2