[GPG 5 글 6.7] rand() & 0x100 자세히 설명좀 해주세요
Moderator: 류광
Re: rand() & 0x100 자세히 설명좀 해주세요
% 연산자 아닌데요.비회원 wrote:if( rand() & 0x100 )
어떻게 되는지
자세히 설명좀 해주세요
-
- Posts: 290
- Joined: 2006-07-10 02:25
rand()는 0~RAND_MAX의 범위에서 무작위로 하나의 수를 골라주는 함수입니다.
0x100은 뒤에서 9번째 비트만 1이고 나머진 전부 0인 숫자고요.
그 두가지를 &연산 했을 경우의 결과는 50% 확률로 0이 나오고, 50% 확률로 0아닌 숫자가 나옵니다.
C언어에서 0은 false로, 0아닌 수는 true로 대입되므로
저 조건문은 50:50 확률로 참 또는 거짓이 됩니다.
0x100이 1비트만 1이라는 것 외에 달리 무슨 의미가 있는 수라고는 생각되지 않습니다.
문제는 저런 암호같은 코드를 써놓고 왜 주석이 없냐는 건데.. 코드 작성한 사람에게 따져보시길.
0x100은 뒤에서 9번째 비트만 1이고 나머진 전부 0인 숫자고요.
그 두가지를 &연산 했을 경우의 결과는 50% 확률로 0이 나오고, 50% 확률로 0아닌 숫자가 나옵니다.
C언어에서 0은 false로, 0아닌 수는 true로 대입되므로
저 조건문은 50:50 확률로 참 또는 거짓이 됩니다.
0x100이 1비트만 1이라는 것 외에 달리 무슨 의미가 있는 수라고는 생각되지 않습니다.
문제는 저런 암호같은 코드를 써놓고 왜 주석이 없냐는 건데.. 코드 작성한 사람에게 따져보시길.
흠,,, 그냥 제가 알려드릴께요
우선,바로 위에분은 &0x01 일때와 혼동하시것 같습니다.
어떤 목적을 가지고 코드가 쓰여졌는지 모르겠는데, 아마도 %256 을 대신하기 위해서
썼지않나 싶은데요..그렇다면 결과적으로 잘못쓰여졌구요.
무슨얘기인가하면, 예전에 곱셈과 나눗셈이 수십클럭이상에 소화되던때에,
2의 승수값을 곱할땐 <<, 나눌땐 >>와 같이 쉬프트 연산자를 쓰고
나머지값을 구할땐 %대신 &를 썼었습니다.
x*4 이 표현은 x<<2>>=2 와 같으며
x%4 이 표현은 x&=0x3 과 같습니다.( 4에서 1을 뺀값으로 &를시켜주죠)
만약 위예가 잘 이해가 안되신다면, 어느분 말씀처럼 비트연산에 대한 c나 c++ 입문서 살펴보세요.
그리고, 최근 cpu에서는 굳이 저 방법을 안써도 될정도로 cpu가 좋아졌으니, 비트연산 익히시는데
참고만 되시길~
어떤 목적을 가지고 코드가 쓰여졌는지 모르겠는데, 아마도 %256 을 대신하기 위해서
썼지않나 싶은데요..그렇다면 결과적으로 잘못쓰여졌구요.
무슨얘기인가하면, 예전에 곱셈과 나눗셈이 수십클럭이상에 소화되던때에,
2의 승수값을 곱할땐 <<, 나눌땐 >>와 같이 쉬프트 연산자를 쓰고
나머지값을 구할땐 %대신 &를 썼었습니다.
x*4 이 표현은 x<<2>>=2 와 같으며
x%4 이 표현은 x&=0x3 과 같습니다.( 4에서 1을 뺀값으로 &를시켜주죠)
만약 위예가 잘 이해가 안되신다면, 어느분 말씀처럼 비트연산에 대한 c나 c++ 입문서 살펴보세요.
그리고, 최근 cpu에서는 굳이 저 방법을 안써도 될정도로 cpu가 좋아졌으니, 비트연산 익히시는데
참고만 되시길~
글이 이상하게 올라갔네요.
에이,걍 몬가만 보고 지나가려고했는데,,,^^;
위에 글이 좀 이상하게 짤렸네요.
"var*4" 는 var<<2>>=2
"var%4" 는 var&=0x03
이렇습니다.^^
위에 글이 좀 이상하게 짤렸네요.
"var*4" 는 var<<2>>=2
"var%4" 는 var&=0x03
이렇습니다.^^
Re: 50%의 확률을 의미하네요...
rand() & 1이 어떤면에서 부정확할까요...비회원 wrote:rand() & 1 은 부정확하기 때문에
rand() & 0x100 으로 한것으로 보여집니다..
첫번째 비트가 0이면 짝수, 1이면 홀수 일텐데...
-
- Posts: 480
- Joined: 2006-11-04 16:24
- Location: Creaty Networks
- Contact:
Re: 50%의 확률을 의미하네요...
rand() % 1이라면 확실히 부정확해질텐데요... +_+비회원 wrote:rand() & 1이 어떤면에서 부정확할까요...비회원 wrote:rand() & 1 은 부정확하기 때문에
rand() & 0x100 으로 한것으로 보여집니다..
첫번째 비트가 0이면 짝수, 1이면 홀수 일텐데...
세상이 기다리는 나만의 SHOW!
----------------------------------------------
Zeprod 홈 : http://Zeprod.org
Project. Creaty : http://Creaty.net/
Creaty 게임제작 커뮤니티 : http://Creaty.net/game/
----------------------------------------------
----------------------------------------------
Zeprod 홈 : http://Zeprod.org
Project. Creaty : http://Creaty.net/
Creaty 게임제작 커뮤니티 : http://Creaty.net/game/
----------------------------------------------
장난이 지나친듯;;
읽기 흉하고, 다분히 장난끼가 넘치는데
rand()%2 로 바꾸세요.
결과는 동일합니다.
물론. rand()&0x100 을 만족한다고해서 rand()%2를 만족하는 것은 아니지만
기본적으로 둘다 50%의 확률 근처를 얻게 되어있습니다.
테스트 코드 올립니다.
rand()%2 로 바꾸세요.
결과는 동일합니다.
물론. rand()&0x100 을 만족한다고해서 rand()%2를 만족하는 것은 아니지만
기본적으로 둘다 50%의 확률 근처를 얻게 되어있습니다.
테스트 코드 올립니다.
Code: Select all
#include <Windows>
#include <iostream>
using namespace std;
int main(void)
{
srand( GetTickCount() );
for( int i = 0; i < 10; ++i )
{
int nRand1 = 0;
int nRand2 = 0;
for( int j= 0; j < 100000; ++j )
{
int nRandom = rand();
if( nRandom & 0x100 )
nRand1++;
if( nRandom % 2 )
nRand2++;
}
cout << "&0x100 : " << nRand1 << endl;
cout << "%2 : " << nRand2 << endl;
}
return 0;
}
고민 많이 하고
rand() % 2 에서
rand() & 0x1 로 바꾸고
다시 rand() & 0x100 로 바꾼것 같습니다.
그런데 보통 이런 결과물은 코드를 읽기 힘들게 할뿐이지 별 의미는 없습니다.
세가지다 많이 실행하면 비슷한 값에 수렴할 수 밖에 없습니다.
그 이유는 rand() 때문입니다.
간혹 정확한 랜덤을 원하시는 분이 있는데..
그 말 자체가 오류가 있는거죠.
정말 정확한걸 구현하려면 테이블 만들고 그걸 랜덤으로 순서 바꾸는 정도가 적당할겁니다.
stl에도 shuffle 해주는 알고리즘이 있는데 이거 이용하는게 나을것 같네요.
rand() % 2 에서
rand() & 0x1 로 바꾸고
다시 rand() & 0x100 로 바꾼것 같습니다.
그런데 보통 이런 결과물은 코드를 읽기 힘들게 할뿐이지 별 의미는 없습니다.
세가지다 많이 실행하면 비슷한 값에 수렴할 수 밖에 없습니다.
그 이유는 rand() 때문입니다.
간혹 정확한 랜덤을 원하시는 분이 있는데..
그 말 자체가 오류가 있는거죠.
정말 정확한걸 구현하려면 테이블 만들고 그걸 랜덤으로 순서 바꾸는 정도가 적당할겁니다.
stl에도 shuffle 해주는 알고리즘이 있는데 이거 이용하는게 나을것 같네요.
true random number generator도 구현 가능해요...
요즘 몇몇 시스템에서 보이듯이, true random number generator도 구현 가능합니다. deterministic하게는 안나오는게 당연하니, 하드웨어적으로 noise를 샘플해서 돌려주는 형태가 되지요.