【问题标题】:rand() Function to give a 32-bit random unsigned intrand() 函数给出一个 32 位随机无符号整数
【发布时间】: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_MAX32767

标签: c random bit


【解决方案1】:

您的代码有两个问题。首先rand返回int而不是unsigned int,如果你的unsigned int是32位,那么如果设置了最高位,则向左移位到17位是无效的。第二个问题是,如果 rand 确实返回 more 超过 15 位,那么你得到的太多了。对这两种情况的一个简单解决方法是将&0x7fffu - 这将确保仅设置15 位并且结果值为unsigned

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

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


请注意,尽管任何仅返回 0 到 32767 之间的值的随机数生成器都可能非常糟糕,而且低位很可能不是很独立,它可以是不是你最终将无法生成所有值......

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2013-06-21
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多