我使用的是PCG随机数生成包,无法理解以下代码。
time(NULL) ^ (intptr_t)&printf
是生成随机化种子的函数的参数:
void pcg32_srandom(uint64_t seed, uint64_t seq)
在main函数中,它将按如下方式使用:
pcg32_srandom(time(NULL) ^ (intptr_t)&printf, 54u);
BTW我也想问为什么" 54u"应该这样写吗?
答案 0 :(得分:2)
我不确定您对随机数生成器了解多少,但通常通过向其传递一个称为“种子”的数字来初始化随机数生成器。在这种情况下,种子被选择为time function XORed返回的时间与printf
函数的地址。我认为这不是一个非常好的随机种子,我不相信任何重要的加密任务。
在C中,当你编写54u
时,它告诉编译器你正在写一个无符号数。您发布的代码中实际上并不需要u
。
答案 1 :(得分:2)
让我们分解......
/* original: pcg32_srandom(time(NULL) ^ (intptr_t)&printf, 54u); */
uint64_t a = time(NULL);
uint64_t b = (intptr_t)&printf;
uint64_t c = a ^ b;
uint64_t d = 54u;
printf("a=%llx\n", (unsigned long long) a); /* no guessing about length */
printf("b=%llx\n", (unsigned long long) b); /* (thank you @chux) */
printf("c=%llx\n", (unsigned long long) c);
printf("d=%llx\n", (unsigned long long) d);
pcg32_srandom( a ^ b, d);
所以... ^是按位 xor 运算符(编辑:我最初编写或)。 添加printf应该可以帮助您跟踪代码正在执行的操作。 显然,代码与时俱进 printf函数的地址(这很聪明,我还没见过 那之前)。
54u上的你可能是原作者谨慎的。 在进行位操作时,通常不需要带符号的数字。 这有一些背景:http://soundsoftware.ac.uk/c-pitfall-unsigned
我们可以在这里看到pcg32_srandom()的API: http://www.pcg-random.org/using-pcg-c-basic.html
and these variants for the global RNG:
void pcg32_srandom(uint64_t initstate, uint64_t initseq)
uint32_t pcg32_random()
uint32_t pcg32_boundedrand(uint32_t bound)
所以看起来他们正试图想出一个种子 随机数生成器“initstate”,由于某种原因, 想用54u作为“initseq”。