[GPG 5 글 6.7] rand() & 0x100 자세히 설명좀 해주세요

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

rand() & 0x100 자세히 설명좀 해주세요

Post by 비회원 »

if( rand() & 0x100 )

어떻게 되는지

자세히 설명좀 해주세요
비회원

왜 저는...

Post by 비회원 »

저는 왜... 이 글을 보고 화가 나는걸까요...; 아무튼 답변해드리자면

0x100은 16진수이고

%는 나머지 연산입니다.

if는 조건문이고

rand는 랜덤값을 반환합니다.


연구해보세요.
비회원

Re: rand() & 0x100 자세히 설명좀 해주세요

Post by 비회원 »

비회원 wrote:if( rand() & 0x100 )

어떻게 되는지

자세히 설명좀 해주세요
% 연산자 아닌데요.
비회원

-_-

Post by 비회원 »

아 실수 %가 아니라 &네요.

근데 &라도 이해 안되는건 마찬가지인데요. 저게 &라서 모르겠다는 말씀이신가요??
C언어책 비트 연산자 부분에 &보세요.
Remisa
Posts: 290
Joined: 2006-07-10 02:25

Post by Remisa »

rand()는 0~RAND_MAX의 범위에서 무작위로 하나의 수를 골라주는 함수입니다.
0x100은 뒤에서 9번째 비트만 1이고 나머진 전부 0인 숫자고요.
그 두가지를 &연산 했을 경우의 결과는 50% 확률로 0이 나오고, 50% 확률로 0아닌 숫자가 나옵니다.
C언어에서 0은 false로, 0아닌 수는 true로 대입되므로
저 조건문은 50:50 확률로 참 또는 거짓이 됩니다.

0x100이 1비트만 1이라는 것 외에 달리 무슨 의미가 있는 수라고는 생각되지 않습니다.
문제는 저런 암호같은 코드를 써놓고 왜 주석이 없냐는 건데.. 코드 작성한 사람에게 따져보시길.
비회원

흠,,, 그냥 제가 알려드릴께요

Post by 비회원 »

우선,바로 위에분은 &0x01 일때와 혼동하시것 같습니다.

어떤 목적을 가지고 코드가 쓰여졌는지 모르겠는데, 아마도 %256 을 대신하기 위해서
썼지않나 싶은데요..그렇다면 결과적으로 잘못쓰여졌구요.

무슨얘기인가하면, 예전에 곱셈과 나눗셈이 수십클럭이상에 소화되던때에,
2의 승수값을 곱할땐 <<, 나눌땐 >>와 같이 쉬프트 연산자를 쓰고
나머지값을 구할땐 %대신 &를 썼었습니다.

x*4 이 표현은 x<<2>>=2 와 같으며
x%4 이 표현은 x&=0x3 과 같습니다.( 4에서 1을 뺀값으로 &를시켜주죠)

만약 위예가 잘 이해가 안되신다면, 어느분 말씀처럼 비트연산에 대한 c나 c++ 입문서 살펴보세요.
그리고, 최근 cpu에서는 굳이 저 방법을 안써도 될정도로 cpu가 좋아졌으니, 비트연산 익히시는데
참고만 되시길~
비회원

글이 이상하게 올라갔네요.

Post by 비회원 »

에이,걍 몬가만 보고 지나가려고했는데,,,^^;


위에 글이 좀 이상하게 짤렸네요.

"var*4" 는 var<<2>>=2
"var%4" 는 var&=0x03

이렇습니다.^^
비회원

컥,,, 나누기 표시쓰면 이상하게 파싱되나보네요.

Post by 비회원 »

var*4 는 var<<2>>=2
var%4 는 var&=0x03


이런 웃지못할일이^^;
비회원

50%의 확률을 의미하네요...

Post by 비회원 »

rand() & 1 은 부정확하기 때문에
rand() & 0x100 으로 한것으로 보여집니다..
비회원

Re: 50%의 확률을 의미하네요...

Post by 비회원 »

비회원 wrote:rand() & 1 은 부정확하기 때문에
rand() & 0x100 으로 한것으로 보여집니다..
rand() & 1이 어떤면에서 부정확할까요...
첫번째 비트가 0이면 짝수, 1이면 홀수 일텐데...
Zeprod
Posts: 480
Joined: 2006-11-04 16:24
Location: Creaty Networks
Contact:

Re: 50%의 확률을 의미하네요...

Post by Zeprod »

비회원 wrote:
비회원 wrote:rand() & 1 은 부정확하기 때문에
rand() & 0x100 으로 한것으로 보여집니다..
rand() & 1이 어떤면에서 부정확할까요...
첫번째 비트가 0이면 짝수, 1이면 홀수 일텐데...
rand() % 1이라면 확실히 부정확해질텐데요... +_+
세상이 기다리는 나만의 SHOW!
----------------------------------------------
Zeprod 홈 : http://Zeprod.org
Project. Creaty : http://Creaty.net/
Creaty 게임제작 커뮤니티 : http://Creaty.net/game/
----------------------------------------------
비회원

.

Post by 비회원 »

sizeof(0x100) 을 하게 되면 4바이트가 나옵니다.
당연한 얘기겠죠? 0x0100 과 같습니다.

저 코드대로 수행이 되고, 코드 그대로의 의미를 읽는다면
32개의 비트중 뒤에서 9번째의 비트가 1일 경우만 참이다.
그러므로 1/32 확률로 참이된다는 뜻이겠죠...
비회원

Post by 비회원 »

그러므로 1/32 확률로 참이된다는 뜻이겠죠...
1/2 확률 아닌가요???
비회원

Post by 비회원 »

비회원 wrote:
그러므로 1/32 확률로 참이된다는 뜻이겠죠...
1/2 확률 아닌가요???
그러게요~ 9번째 비트가 1인 경우 다른 비트와 상관 없이 참이므로

2/1 확률일텐데요 ^^;;
비회원

장난이 지나친듯;;

Post by 비회원 »

읽기 흉하고, 다분히 장난끼가 넘치는데

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;
}


비회원

Post by 비회원 »

고민 많이 하고
rand() % 2 에서
rand() & 0x1 로 바꾸고
다시 rand() & 0x100 로 바꾼것 같습니다.

그런데 보통 이런 결과물은 코드를 읽기 힘들게 할뿐이지 별 의미는 없습니다.
세가지다 많이 실행하면 비슷한 값에 수렴할 수 밖에 없습니다.
그 이유는 rand() 때문입니다.

간혹 정확한 랜덤을 원하시는 분이 있는데..
그 말 자체가 오류가 있는거죠.
정말 정확한걸 구현하려면 테이블 만들고 그걸 랜덤으로 순서 바꾸는 정도가 적당할겁니다.
stl에도 shuffle 해주는 알고리즘이 있는데 이거 이용하는게 나을것 같네요.
비회원

true random number generator도 구현 가능해요...

Post by 비회원 »

요즘 몇몇 시스템에서 보이듯이, true random number generator도 구현 가능합니다. deterministic하게는 안나오는게 당연하니, 하드웨어적으로 noise를 샘플해서 돌려주는 형태가 되지요.
비회원

사족이지만..

Post by 비회원 »

얼마전에 웹프로그래밍을 했는데


php였던가...


if( x & 0100 ) 이런식의 코드..

즉 0100 같은건 플래그로 많이 쓰이는 숫자잖아요..

거짓나오드라구요...

1비트 값이 0 이냐 1이냐만이 참으로 표현되는 언어도 있는 것 같았습니다...


이글을 쓰는 순간..확인을 안해본 불안함이 있지만..

여하튼... 저런 경우가 있었답니다..
Post Reply