【问题标题】:Generating random numbers from -n to n in C在C中生成从-n到n的随机数
【发布时间】:2009-11-04 09:07:15
【问题描述】:

我想生成从 -n 到 n 不包括 0 的随机数。有人可以提供 C 中的代码吗?如何排除0?

【问题讨论】:

  • 为什么投反对票?我希望这个网站强迫人们在投反对票时添加评论。

标签: c random


【解决方案1】:

一个想法可能是在 [1,2n] 范围内生成一个随机数 x,包括端点。如果x 大于n,则返回-(x - n),否则返回x

这应该可行:

int my_random(int n)
{
  const int x = 1 + rand() / (RAND_MAX / (2 * n) + 1);

  return x > n ? -(x - n) : x;
}

有关如何安全使用rand() 的更多信息,请参阅comp.lang.c FAQ;它解释了上述用法。

【讨论】:

  • 谢谢。克里斯刚刚在你面前发布了答案,所以我这样做了。
【解决方案2】:

我可以建议做的最简单的事情是生成一个介于 0 和 2n 之间的随机数,然后进行数学运算:

result= n - randomNumber 

虽然 0 可能不太可能,但您可以使用 If 进行检查并重新生成随机数。

【讨论】:

    【解决方案3】:
    int random(int N) 
    { 
      int x;
      do{
        x=rand()%(N*2+1)-N;
      }while(x==0);
      return x;
    }
    

    它从-N到N中选择一个数字,但如果它是0则继续这样做。

    如 cmets 中所建议的,另一种方法是生成一个介于 -N 和 N-1 之间的数字,如果其为正数或 0,则将其递增:

    int random(int N) 
    { 
      int x;      
      x=rand()%(N*2)-N;
      if(x>=0) x++;
      return x;
    }
    

    【讨论】:

    • 一个依赖于随机值的do-while可能会执行很长时间!但是您可以通过将随机结果的范围减少 1,然后人为地将任何 0 结果转换为丢失的边界结果来摆脱不确定的执行时间。不需要循环。
    • 我不同意你的说法,即它需要“很长很长时间”:x 为 0(因此循环重复)的几率是 1/(2N+1) ,对于较大的 N 值来说,这相当小。不过,我已将您的建议纳入我的回答中,我认为这会为这个特定问题提供更好的解决方案,所以谢谢 :)
    • 啊...我没有说它“会”需要很长时间,而是说它“可能”需要很长时间。它们是有区别的! :) 如果这听起来很厚脸皮,我很抱歉。我在实时软件中工作,不能绝对保证在某个确定的时间内完成的任何事情“可能需要很长时间”。从技术上讲,您的第一个版本是 O(?),而您的第二个版本是 O(1)(或者在最坏的情况下,不比“rand”复杂)。因此,就确定性而言,您的第二个版本是一个很大的改进。做得很好,顺便说一句。我的“将 0 转换为边界”的建议不会那么漂亮。
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多