1

友人が 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);
        }

私の質問は、このコードはどのように機能し、どのようにランダムな色を作るのですか

4

2 に答える 2

2

あなたの友人は、彼が発明したアマチュア PRNG から 0x000000 から 0xFFFFFF の範囲の「ランダムな RGB 値」を作成しています。

コメント付きでコードを説明します。

これがいわゆる「種」です。値の疑似乱数シーケンスを生成する初期値。

 int unsigned temp = 10101; //seed 

次に、for ループを取得します。

 for(int y = 0;y < times;y++)
 {
    temp = temp*(y+y+1);
    temp = (temp^(0xffffff))>>2;

ラウンドごとに、友人は複雑な乗算と合計を作成して、2 で割った新しい一時値 (上記のコードの >>2) を計算し、0xFFFFFFFF でマスクして 0x000000 ~ の範囲の値を取得しようとしています。 0xFFFFFFF (ビットごとの AND & の代わりにビットごとの XOR ^ を誤って使用した)

結果の値はSDL_FillRect()関数のRGB値として使用されます.

    //printf("%x\n",temp);
    SDL_FillRect(sprite[y],NULL,temp);
    SDL_BlitSurface(sprite[y],&paste[y],rScreen(),NULL);
 }
于 2012-11-15T20:48:11.603 に答える
1

魔法は次の 4 行にあります。

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
于 2012-11-15T20:47:44.467 に答える