In-place algorithm으로 짜면 swapping 방식으로 구현해야 하겠지만
In-place algorithm으로 짜지 않으면 이렇게 더 효율적으로 짤 수 있음...
내가 만든 shuffle 함수는 함수를 일반화시켜서 N칸의 int 배열과 N을 인자로 받아 0 ~ N-1의 숫자를 발생시키도록 고안함.
이거보다 더 효율적인 코드가 존재할까?
In-place algorithm으로 짜면 swapping 방식으로 구현해야 하겠지만
In-place algorithm으로 짜지 않으면 이렇게 더 효율적으로 짤 수 있음...
내가 만든 shuffle 함수는 함수를 일반화시켜서 N칸의 int 배열과 N을 인자로 받아 0 ~ N-1의 숫자를 발생시키도록 고안함.
이거보다 더 효율적인 코드가 존재할까?
그러고보니 srand(time(NULL)); 넣으려고 time.h 인클루드했는데 main 함수에 넣는 걸 깜빡 잊어버림 ㅋ 뭐 중요한 건 main의 코드가 아니라 shuffle 함수니깐. 고치지 않고 냅두겠음.
음냐. 자아도취를 방해하고 싶진 않은뎅..
while(pool_ptr < pool_end) ... ; 이거부터 되게 개념없게 짠거야.
물론 디씨 아가들한테 까일 코드는 아니다만.
코딩 배틀 하실래요 코세 성님?...은 농담 ㅋㅋㅋ 구체적으로 어느 부분이 개념없는 건가요? 나름 a[i] ==> *(a + i) 같은 덧셈 연산을 최소화하려고 그렇게 짠 건데...
while(deck[card_count--] = card_count, card_count);
이게 낫겠니 아니면
int* ptr = deck; int* end = deck + CARD_COUNT; while(ptr < end) *ptr++ = --card_count;
너처럼 이렇게 하는게 낫겠니
그리고 int *pool_end = &pool;[card_count]; 이게 편하니? int* pool_end = pool + card_count; 보다?
그 아래코드도 =_=
생각해 보니 제가 멍청했네요. while(--card_count) *ptr++ = card_count;만 해도 됐었을 것을...
배열의 원소 개수가 card_count 개수임이 명백한데 쓸데없는 이상한 코드를 짰네요... =_=;;
아니 주소를 증가시킬거면 card_count 를 왜 또 까면시 비교해 ㅋㅋ
이도 저도 아닌코드야 그건 ㅋㅋ
a + i 대신 &a[i] 형태로 표기한 것은 그나마 가독성 살려줄려고 그런 거에요. 어차피 컴파일할 때는 똑같으니깐...
파이프라이닝 타면 속도는 거의 같지 ㅋㄷ
게 뭔 가독성 코드야 ㅋㅋ 타이핑만 늘지 너무 기본인데.
직접 포인터 주소 증가시키나 deck[card_count] 하면서 *(deck + card_count) 시키나 일단은 똑같은 거 아닌가요? 딱히 후자가 더 낫다고 생각은 안드는데요...ㄷㄷ
그건 내가 보기엔 베이직의 잔재다.
어차피 둘 다 덧셈 연산 하나 드는 건 마찬가지인 거 같아서요...
배열로 표현하면되는데 복잡하게 포인터 연산으로 늘어쓰는것도 바보같고, 배열연산에서 주소 꺼내는것도 바보같은거야.
기호 수가 다르지.
짧은 건 성님 코드가 더 짧긴 하네요 ㅋㅋㅋ 숏코딩을 염두에 뒀으면 저도 저렇게 안 짰을듯 ㅋㅋㅋ
나도 옛날엔 너처럼 짰어. 점점 그게 꼴사나와서 고친거지 ㅋㅋ
ㅠㅠ 곰곰이 생각해 보니 짜면서 똑같다는 생각은 들었는데 괜히 길게 늘여서 짠 거 같네요. 겉멋 부리려고 했던가...
pool 의 갯수가 card 수 보다 1 이 더 커야 하는 이유는?
짜면서 머리 속으로는 ptr 늘리면서 쓰나 a[i] 형태로 쓰나 덧셈 연산 한 번씩 일어나는 건 똑같으니 굳이 포인터로 쓸 필요가 없다는 생각을 분명히 한 거 같은데 손은 겉멋 부리려고 전자로 ㅋㅋㅋ
그것도 겉멋이에요. 필요는 없죠. 걍 C언어 호환성을 critical하게 최대화시키려고 했달까...
어쨌든 배열의 없는 첨자를 포인트하는 거 자체가 표준 상으로는 위법이니까요.
호환성 문제될 부분이 아닌데... 니가 마지막 위치의 내용을 참조하고 있지 않으니까
실행시간 누가 빠름?
넌 포인터 주소만 비교 하고 있을 뿐 내용을 참조하고 있지 않음.
그 C언어에서 배열의 시작 위치 조정하는 트릭 중에 int *ptr = &arr;[-3]; 식으로 하는 트릭도 있는데 이것도 컴파일러에 따라서는 호환성에 문제가 될 수 있으니 쓰지 말라고 하죠. 표준 상으로는 엄연히 위법이라고.
내용을 dereference하는 거랑 관계없이 가리키는 거 자체만으로도 표준 위법이라고 하더라고요.
실행시간은 비등할텐데, 여러번 돌려 통계내면 내가 쨈 더 빠를꺼야. 그래봐야 둘 다 3~400 clock 임 저정도면
형껀 swap으로 짜서 저보다 assignment 연산이 하나 더 많아요.
지금 경우는 당연히, 그런 케이스가 아님.
성능 최적화 하려면 xor swap 으로 안짜지 if continue 도 필요없고
위에 언급한 두개 코드 예제만 보면 내가 제시한 방법이 더 빠르단거야. (잠시 업무 보고 옴)
inplace 방식보다 버퍼를 이용한 방식이 연산 효율이 좋은건 옳은 이야기고, 저 코드가 예뻐 보이려면, 위에 말한 부분이랑 --ptr_end 를 개선해야 할거야.
결국 --ptr_end 에서 버퍼 따로 쓴 효율 다 날려버리고 있다는거
생각해 보니 제가 멍청했네요. while(--card_count) *ptr++ = card_count;만 해도 됐었을 것을... 178.175.*.* <-- card_count 에 0이 들어오면 hell
while(count--) ptr[count] = count; 처럼 하더라도 저렇게 하면 안돼 (이 경우도 내가 보여준 예시보다 JMP구조가 복잡해짐)
rnd 범위 불공정 한거 어떻게 해결해?
이건 애기들 보는 예시지 뭐.
일단 가장 쉬운건 rand가 (max_rnd / range) * range 보다 크면 한번더 rand 하면 되는거고
non-uniform 한건 걍 가정하고 가는거고 uniform 해 지려면 다른 random 써야지.
range 자체가 rand 의 표현 범위를 깎아 먹기 땜에 그런 방식으론 uniform 해 질수 없어용.
rand 여러개 합침대징
rand 자체가 띨뽕해서 별의미 없지...
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.