2012-11-15 3 views
1

내 친구가 내 SDL 프로그램을 위해 나에게 코드의 비트를주고, 모든 나는 그것이 임의의 색상을 만드는 것을 알고 있지만 내가 어떻게 작동하는지 몰라, 여기에 코드SDL, 임의의 색상 발생기

int unsigned temp = 10101;//seed 
    for(int y = 0;y < times;y++){ 
     temp = temp*(y+y+1); 
     temp = (temp^(0xffffff))>>2; 
     //printf("%x\n",temp); 
     SDL_FillRect(sprite[y],NULL,temp); 
     SDL_BlitSurface(sprite[y],&paste[y],rScreen(),NULL); 
     } 

에게 있습니다 내 질문은,이 코드 작업을 수행하고 어떻게 어떻게 임의의 색상을

답변

2
당신의 친구가 0x000000에서에서에 이르기까지 「랜덤 RGB 값을 "만드는

외계인 0xFFFFFF 아마추어 PRNG가 발명 했어.

나는 의견의 코드를 설명 할 것이다 :

이것은 소위 "씨"입니다. 의사 랜덤 값 시퀀스를 생성하는 초기 값입니다.

int unsigned temp = 10101; //seed 

는 우리가 가지고 for 루프 :

친구 라운드 각 복잡한 곱셈과 합계 (2로 나눈 새로운 임시 값을 마련 할 수 있도록 노력하고있다
for(int y = 0;y < times;y++) 
{ 
    temp = temp*(y+y+1); 
    temp = (temp^(0xffffff))>>2; 

다음 >> 2 위의 코드에서) 0xFFFFFFF 0x000000 0xFFFFFFF 범위에서 값을 얻으려면 마스킹 (그는 비트 단위 AND & 대신 잘못 비트 XOR ^)

결과 값은 SDL_FillRect() 함수.

//printf("%x\n",temp); 
    SDL_FillRect(sprite[y],NULL,temp); 
    SDL_BlitSurface(sprite[y],&paste[y],rScreen(),NULL); 
} 
+1

"some amateur PRNG." - 네, 꽤 아마추어이고, 코딩 스타일이 특히 형편 없습니다. –

+0

왜 "비트 논리 AND 대신 비트 XOR ^를 잘못 사용했습니다"코드가 올바르지 않습니다? – Laggy

+1

@Laggy : PRNG에 관해서는 "작동한다"또는 "작동하지 않는다"고 말하기는 어렵습니다. 우리는 생산 된 가치의 통계적 분포에 대해 이야기해야합니다. 좋은 PRNG는 의사 무작위 오라클 (완벽한 무작위 값을 내뱉는 수학적 모델)을 근사해야합니다. 처음에는 제공된 코드가 좋은 PRNG가 아닌 것으로 보입니다. 비트 AND는 0x000000에서 0xFFFFFF까지의 범위를 강제합니다. 대신, XOR^그냥 0xFFFFFF 한계를 초과하도록 무료로두고 임시 비트를 내리고 있습니다. 어쩌면 2로 나누는 것은 범위의 값을 유지하려는 시도 일 수 있습니다. –

1

마법이 네 줄에 만들 않습니다되어

unsigned int temp = 10101; // seed - this seeds the random number generator 

temp = temp * (y + y + 1); // this performs a multiplication with the number itself and y 
// which is incremented upon each loop cycle 
temp = (temp^0xffffff) >> 2; // this reduces the generated random number 
// in order it to be less than to 2^24 
SDL_FillRect(sprite[y], NULL, temp); // and this fills the rectangle using `temp` as the color 
// perhaps it interprets `temp` as an RGB 3-byte color value