c ++中的rand()函数

时间:2011-09-27 15:04:27

标签: c++ c

我不太确定c ++中的这个函数是如何工作的:

int rand_0toN1(int n) {
    return rand() % n;
}

互联网上的另一个教程说要在你需要做一些不同的范围之间获得一个随机数,然后是一个范围内的第一个数字,n是范围内的术语数:

int number = a + rand( ) % n;

我已经读过它应该在0和n-1之间返回一个随机数,但它是如何做到的?我知道%表示除法并给出余数(因此5%2将是1)但是如何最终给出0到n-1之间的数字?感谢您帮助理解这一点。我想我不明白rand()函数返回什么。

6 个答案:

答案 0 :(得分:6)

n >的除以模(余数) 0始终在[0, n )范围内;这是模运算的基本属性。

除非 a = 0,否则

a + rand() % n不会返回[0, n ]范围内的数字。它返回[{em> a , n + a )范围内的int

请注意,此技巧通常会返回uniformly distributed integers 而不是

答案 1 :(得分:4)

rand返回0RAND_MAX之间的伪随机值,通常为32767

模运算符对于“环绕”值非常有用:

0 % 5 == 0
1 % 5 == 1
2 % 5 == 2
3 % 5 == 3
4 % 5 == 4
5 % 5 == 0 // oh dear!
6 % 1 == 1
// etc...

因此,通过将伪随机值与模数组合,您将得到一个保证在0n - 1之间的伪随机值。

答案 2 :(得分:1)

根据您自己的例子,您似乎了解它是如何工作的。

rand()只返回介于0和RAND_MAX之间的整数伪随机数,然后将模运算符应用于该数字。由于模运算符返回一个数除以另一个数的余数,因此除以N的数字将始终返回小于N的数。

答案 3 :(得分:0)

rand()函数在区间中返回一个整数值 [0...RAND_MAX]x % n的结果将始终存在于[0...n)中 范围x >= 0(至少提供{{1}});这是基本的数学。

答案 4 :(得分:0)

请看这里:

http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

通常你用时间函数“播种”它。然后使用模数运算符指定范围。

答案 5 :(得分:0)

c ++ rand()函数为您提供一个从0到RAND_MAX(<cstdlib>中定义的常量)的数字,该数字至少为32767.(from the c++ documentation

模数(%)运算符给出除数后的余数。当你和rand()一起使用时,你用它来设置随机数的上限(n)。

例如,假设您想要一个介于0和4之间的数字。调用rand()会给出0到32767之间的答案。然而,rand()%5将强制余数为0,1,2 ,3或4取决于返回的值rand()(如果rand()返回10,10%5 = 0;如果返回11,11%5 = 0等)。