【发布时间】:2011-01-06 23:42:19
【问题描述】:
我需要从 1 到 9 的随机数(没有 0)。
//numbers 0 to 9
int iRand = rand() % 10;
但我需要 1 到 9。
谢谢。
【问题讨论】:
-
好吧,我还年轻,需要时间……
标签: c++
我需要从 1 到 9 的随机数(没有 0)。
//numbers 0 to 9
int iRand = rand() % 10;
但我需要 1 到 9。
谢谢。
【问题讨论】:
标签: c++
就这个:
int iRand = (rand() % 9) + 1;
【讨论】:
嗯,你知道如何获取 [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
这就是你应该如何考虑这些事情的方式。
【讨论】:
试试:
int iRand = 1 + rand() % 9;
它的工作原理是从 0 到 8 中取一个随机数,然后向其中添加一个(尽管我在代码中以相反的顺序编写了这些操作 - 你首先要根据个人喜好来编写这些操作)。
请注意,% 的优先级高于 +,因此括号不是必需的(但可能会提高可读性)。
【讨论】:
初始化随机数生成器调用srand(time(0)); 然后,将整数x 设置为low(包括)和high(不包括)之间的值:
int x = int(floor(rand() / (RAND_MAX + 1.0) * (high-low) + low));
如果 high 和 low 都是非负数,则不需要 floor()。
不建议对随机数使用模数 (%),因为您不会在低位中获得太多变化,因此您会发现分布非常弱。
【讨论】:
怎么样
int iRand = (rand() % 9) + 1;
doh 被秒杀
【讨论】:
无论选择哪个答案,基于模的测距都是有偏差的。你可以在整个互联网上找到它。所以如果你真的很在意,那么你必须做更多的事情(假设 arc4random() 返回一个 4 字节整数):
#define NUMBER 9.0
#define RANDOM() (((int)(arc4random() / (float)0xffffffff * (float)NUMBER) + 1) % (NUMBER + 1))
我留给你找出正确的语法,因为你听起来像一个非常有能力的开发人员。
【讨论】: