【问题标题】:C++ random number 1-9C++ 随机数 1-9
【发布时间】:2011-01-06 23:42:19
【问题描述】:

我需要从 1 到 9 的随机数(没有 0)。

//numbers 0 to 9
int iRand = rand() % 10;

但我需要 1 到 9。

谢谢。

【问题讨论】:

  • 好吧,我还年轻,需要时间……

标签: c++


【解决方案1】:

就这个:

int iRand = (rand() % 9) + 1;

【讨论】:

    【解决方案2】:

    嗯,你知道如何获取 [0, x] 范围内的随机整数,对吧?那是:

    rand() % (x + 1)
    

    在您的情况下,您已将 x 设置为 9,从而为您提供 rand() % 10。那么如何操纵范围以达到 1-9 呢?好吧,既然 0 是这个随机数生成器方案的最小值,我们知道我们需要加一才能得到最小值:

    rand() % (x + 1) + 1
    

    现在你得到范围 [1, x + 1]。如果假设为 [1, 9],则 x 必须为 8,给出:

    rand() % 9 + 1
    

    这就是你应该如何考虑这些事情的方式。

    【讨论】:

      【解决方案3】:

      试试:

      int iRand = 1 + rand() % 9;
      

      它的工作原理是从 0 到 8 中取一个随机数,然后向其中添加一个(尽管我在代码中以相反的顺序编写了这些操作 - 你首先要根据个人喜好来编写这些操作)。

      请注意,% 的优先级高于 +,因此括号不是必需的(但可能会提高可读性)。

      【讨论】:

        【解决方案4】:

        初始化随机数生成器调用srand(time(0)); 然后,将整数x 设置为low(包括)和high(不包括)之间的值:

        int x = int(floor(rand() / (RAND_MAX + 1.0) * (high-low) + low));
        

        如果 high 和 low 都是非负数,则不需要 floor()

        不建议对随机数使用模数 (%),因为您不会在低位中获得太多变化,因此您会发现分布非常弱。

        【讨论】:

          【解决方案5】:

          怎么样

          int iRand = (rand() % 9) + 1;
          

          doh 被秒杀

          【讨论】:

            【解决方案6】:

            无论选择哪个答案,基于模的测距都是有偏差的。你可以在整个互联网上找到它。所以如果你真的很在意,那么你必须做更多的事情(假设 arc4random() 返回一个 4 字节整数):

            #define NUMBER 9.0
            #define RANDOM() (((int)(arc4random() / (float)0xffffffff * (float)NUMBER) + 1) % (NUMBER + 1))
            

            我留给你找出正确的语法,因为你听起来像一个非常有能力的开发人员。

            【讨论】:

            • 在我的情况下,我不需要随机数的均匀分布。但是感谢您的提示...; )
            猜你喜欢
            • 2011-12-14
            • 1970-01-01
            • 1970-01-01
            • 2014-06-14
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 2011-07-26
            • 1970-01-01
            相关资源
            最近更新 更多