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 的值这一事实有关(据我所知明白)。
希望有人能帮帮我。
干杯
您的代码有两个问题。首先是rand
returns 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 位不是很独立,你最终可能无法生成所有值...
我在编写一个采用 3 个 rand()- 值并生成 32 位值的函数时遇到了一些问题。具体来说,它必须是第一个 rand() 操作的 15 位;然后附加来自第二个 rand() 操作的另一个 15 位;最后附上最后一个 rand() 操作的 2 位;
我的想法是这样的
unsigned int x = (rand()<<17 | rand()<<2 ) | rand()>>13;
但是我不认为这个函数给我整个 unsigned int 范围的值,我猜它与 rand() 给你至少 32767 的值这一事实有关(据我所知明白)。
希望有人能帮帮我。
干杯
您的代码有两个问题。首先是rand
returns 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 位不是很独立,你最终可能无法生成所有值...