【问题标题】:What means rand() % range + lower? [closed]rand() % range + lower 是什么意思? [关闭]
【发布时间】:2020-12-18 11:09:42
【问题描述】:

我现在正在学习 C,我不明白这行代码中的 rand() % range + lower 是什么意思。

printf("I will generate 10 random numbers between %d and %d . . .\n", lower, upper);

int range = upper - lower+1;                        
for(int i = 0; i <= 10; i++) {                      
    int number = rand() % range + lower;            
    printf("%d\t", number);

【问题讨论】:

  • 你知道%运算符是什么吗?
  • This 帖子解释了 % 运算符的作用。将模数 (%) 与 + 结合使用可实现 printf 语句中的内容。
  • rand() 函数会返回一个随机数。这个数字可以很大也可以很小。 % 这个操作符执行 mod 操作。 (rand () % range) 返回此随机数除以范围的余数。所以你得到一个介于 0 和 (range-1) 之间的随机数,你添加到这个数字的任何东西都会给你下限。
  • 请解释一下你有什么困惑,因为我的印象是“将在...上下之间生成...随机数”问题包含了答案。
  • 假设你想要一个在lower=2upper=5范围内的随机数,所以你想要得到2、3、4或5。这是四种可能性,你从upper - lower + 1得到= 4。接下来,rand() % 4 给出一个 0..3 范围内的数字,最后将其添加到 lower 以给出四种可能性之一。

标签: c


【解决方案1】:

这是一个穷人的线性随机发生器。

它确实是随机的,因为它是从rand() 提供的,它返回一个随机整数,并且通过构造,值是 >= lower 和

但它仍然是穷人的工具,因为 [lower, upper] 区间中的值可能具有不同的概率。

长话短说,如果您只需要一些随机值,则可以使用它,但如果您需要加密的安全随机源,则不应该使用它。

【讨论】:

  • 这只是我教授的一个练习,处理随机数。但我不明白 range +lower 背后的想法。
  • 不是range + lower。是(rand() % range) + lower
【解决方案2】:

请阅读 abut % 运算符。它是模除法。 模除法是将最大范围统一映射到最短范围的好工具(在您的情况下 rand() % range)。您只需要添加范围开始即可将所有值移动到正确的位置。 代码 rand() % range + lower 是标准 C 习惯用法,用于从 A、B 范围内获取随机数。您可以找到更多成语,例如具有 (A,B) 范围或 范围的浮点数。

【讨论】:

  • 来自 OP 的 commentrange + lower 是什么?”请注意,% 运算符的优先级高于 + 运算符。
猜你喜欢
  • 2018-01-24
  • 2010-12-29
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2013-05-16
  • 2011-04-03
相关资源
最近更新 更多