rand() 函数给出一个 32 位随机 unsigned int

rand() Function to give a 32-bit random unsigned int

我在编写一个采用 3 个 rand()- 值并生成 32 位值的函数时遇到了一些问题。具体来说,它必须是第一个 rand() 操作的 15 位;然后附加来自第二个 rand() 操作的另一个 15 位;最后附上最后一个 rand() 操作的 2 位;

我的想法是这样的

unsigned int x = (rand()<<17 | rand()<<2 ) | rand()>>13;

但是我不认为这个函数给我整个 unsigned int 范围的值,我猜它与 rand() 给你至少 32767 的值这一事实有关(据我所知明白)。

希望有人能帮帮我。

干杯

您的代码有两个问题。首先是randreturns int而不是unsigned int,如果你的unsigned int是32位,那么往左移位到位置17是无效的如果top位被设置。第二个问题是,如果 rand 确实比 15 位 return 更多 那么你得到的太多了。对这两者的一个简单修复是 &0x7fffu - 这将确保只设置 15 位 结果值为 unsigned:

unsigned int x = ((rand() & 0x7fffu)<<17 | (rand() & 0x7fffu)<<2 ) | (rand() & 0x7fffu)>>13;

另一个,如果你知道这些值是 真正 独立的(编辑:正如 Eric 注意到的,也是 2 的幂),将使用 xor ^ 而不是 or - 这将确保所有值仍然是可能的。


请注意,任何 return 的值仅从 0 到 32767 的随机数生成器都可能 非常糟糕 并且很可能较低-order 位不是很独立,你最终可能无法生成所有值...