所以我有一个家庭作业,我们需要在C中生成1到100之间的随机数。我有一个工作示例,其中int i = rand()%100; 但是根据技术上不正确的作业,我实际上并没有得到。作业说明如下
“ 1.1我们使用随机数发生器模拟公交车的到达时间。===> rand()函数。rand()函数将伪随机数0返回给RAND_MAX(在Linux中为2 ^ 31-1)。随机数rn,介于0.0到1.0之间; rn = rand()/ RAND_MAX。(顺便说一下,很多人在下面创建例如2位数的随机数。r_num = rand()%100;因为%100是0到99。但是,这是错误的。生成2位数随机数的正确方法是:将0-RAND_MAX分成10个间隔,看看随机数落在哪里。间隔时间为= RAND_MAX / 100。通过以下方式将其映射到0-99之一:0 1 2 3 .........99 0 it 2 * it 3 * it 99 * it到RAND_MAX如果rand()返回一个介于(12 * it)和(13 * it)之间的数字,则2位随机数为12。)“
我希望有人可以解释一下我说的是什么,我并不是真正在寻找代码示例,只是为了理解问题。
那里有两个问题,都与模运算符的工作方式有关。  a % b当您将a除以b时,有效地为您提供了余数。因此,让我们假设我们以4为模来计算数字。我们还假设RAND_MAX = 6,因为我真的不希望表中有32768+行。
  a | a % 4
------------
  0 | 0
  1 | 1
  2 | 2
  3 | 3
  4 | 0
  5 | 1
  6 | 2
因此,如果您使用这种方法来生成1到4之间的随机数,则会有两个问题。首先,一个简单的数字:生成的数字介于0和3之间,而不是1和4之间。取模运算符的结果将始终在0和模之间。
另一个问题更加微妙。如果RAND_MAX不均匀地除以模数,则每个数字的机率将不同。在我们的示例中,有两种方法分别使0到2,但只有一种方法使3变为3。因此3的发生率约为14.3%,其他数字的发生率约为28.6%。为了获得均匀的分布,您需要找到一种方法来处理RAND_MAX分配不均的情况。