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),然后用 0xFFFFFFF 屏蔽以获得 0x000000 到0xFFFFFFF(他错误地使用了按位 XOR ^ 而不是按位 AND &)

结果值用作 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

神奇之处在于这四行:

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 回答