【发布时间】:2021-12-27 11:56:11
【问题描述】:
我在编写一个需要 3 个 rand()- 值并生成 32 位值的函数时遇到了一些麻烦。具体来说,它必须是第一个 rand() 操作的 15 位;然后从第二个 rand() 操作中附加另一个 15 位;最后附加上一次 rand() 操作的 2 位;
我的想法是这样的
unsigned int x = (rand()<<17 | rand()<<2 ) | rand()>>13;
但是我不认为这个函数给了我整个 unsigned int 范围的值,我猜这与 rand() 给你至少 32767 的值有关(据我了解) .
希望有人能帮帮我。
干杯
【问题讨论】:
-
(a) 您的帖子中没有提出任何实际问题。 (b)
rand不会给你“至少 32767 的值”。在任何 C 实现中,它都有可能返回的最大值,该值至少为 32,767。rand返回从 0 到某个最大值RAND_MAX的整数,RAND_MAX至少为 32,767。 (c)rand() << 17可以溢出int,所以你需要(unsigned int) rand() << 17。 (d) 如果rand()可能返回大于 32,767 的值,则(rand()<<17 | rand()<<2 ) | rand()>>13与它们重叠;一些重叠位将与 OR 组合。 -
您可以通过在应用
|之前将rand结果减少到15 位来解决重叠问题。或者,如果您知道正在使用的rand实现仅返回 15 位数字(从 0 到 32,767 的整数),您可以忽略它;(unsigned int) rand() << 17 | rand() << 2 | rand() >> 13没问题,假设unsigned int是 32 位,rand返回的值小于 2^29(这样rand() << 2就不会溢出)。 -
我可能会使用
((unsigned)rand() << 17) ^ (rand() << 8) ^ rand() -
@WeatherVane:那么您需要额外保证
RAND_MAX+1 是二的幂。 -
@EricPostpischil 是的:我正在考虑 MS VC 版本,其中
RAND_MAX是32767