【问题标题】:C - rand() modulo 0C - rand() 模 0
【发布时间】:2015-10-17 21:10:51
【问题描述】:

当我试图通过int 生成随机数 0 时:

//Populate Currently Allocated Reasource for each customer
for (i = 0; i < NUMBER_OF_CUSTOMERS; i++) 
{
    printf("%d:[ ",i);
    for (j = 0; j < NUMBER_OF_RESOURCES; j++)
    {
        allocation[i][j] = rand() % maximum[i][j];
        printf("%d ",allocation[i][j]);
    }
    printf("] \n\n");
}

maximum[i][j] 为 0 时出现浮点异常。

有没有更好的方法来创建一个没有floating point error 引起的rand() % 0 的随机数?

编辑: 最大值为0时,输出的随机数应为0。

【问题讨论】:

  • 问你rmath老师为什么除以0是未定义的。
  • allocation[][]maximum[][]ints 还是 floats 的数组?

标签: c random int modulo


【解决方案1】:

a 除以b 时,使用a % b 得到余数。因此,它总是会给你一个小于b 的结果,并且当b 为零时它不起作用,因为你不能除以零。

如果要0到x之间的随机数,需要取rand() % (x + 1)

【讨论】:

【解决方案2】:

尝试改用这个

//Populate Currently Allocated Reasource for each customer
for (i = 0; i < NUMBER_OF_CUSTOMERS; i++) 
{
    printf("%d:[ ",i);
    for (j = 0; j < NUMBER_OF_RESOURCES; j++)
    {
        allocation[i][j] = maximum[i][j] ? (rand() % maximum[i][j]) : 0;
        printf("%d ",allocation[i][j]);
    }
    printf("] \n\n");
}

【讨论】:

  • 这种格式叫什么?我在哪里可以找到有关其用途的文档?
  • 我的意思是,如果 maximum[i][j] 不是 0,则将 (rand() % maximum[i][j]) 分配给 allocation[i][j] 否则将 0 分配给 allocation[i][j]
  • @Sean,寻找三元运算符
【解决方案3】:

你说:

当最大值为0时,随机数输出应为0。

您可以添加支票来解决这个问题。

if ( maximum[i][j] == 0 )
{
   allocation[i][j] = 0;
}
else
{
   allocation[i][j] = rand() % maximum[i][j];
}

【讨论】:

    【解决方案4】:

    您可以使用?: 运算符巧妙地编写该额外条件:

    allocation[i][j] = maximum[i][j] ? (rand() % maximum[i][j]) : 0;
    

    ?: 条件表达式: 如果条件为真?则值为 X :否则值为 Y


    在计算机编程中,?: 是一种三元运算符,它是多种编程语言中基本条件表达式语法的一部分。它通常被称为条件运算符、内联 if (iif) 或三元 if。

    Wikipedia

    【讨论】:

      【解决方案5】:

      当最大值为0时,随机数输出应为0。

      模运算符是除法后的余数。因为除以零是不确定的,所以模0也是。

      您需要一个条件来防止尝试除以零。您可以使用if/else 语句或ternary operator (?:) 来做到这一点。换句话说,改变这个

      allocation[i][j] = rand() % maximum[i][j];
      

      到以下之一。

      if (maximum[i][j] == 0)
      {
          allocation[i][j] = 0;
      }
      else
      {
          allocation[i][j] = (rand() % maximum[i][j]);
      }
      

      allocation[i][j] = (maximum[i][j] == 0) ? (rand() % maximum[i][j]) : 0;
      

      【讨论】:

      • 当然,无论好坏,条件(maximum[i][j] == 0)可以进一步缩写,因为maximum[i][j],因为0在C中评估为假。但我认为显式条件更清楚。
      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2012-09-02
      • 2012-04-10
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多