3

我试图找出一种可以使用 srand 和 rand 随机生成 -1,0 或 1 的方法。但是,每当我这样做时,我只能获得生成范围内的值,而不能获得 -1 或 1。

这是我尝试过的:

   int value;
   srand(time(NULL));
   value=2*rand()/(RAND_MAX)-1;

但是,执行时,我总是生成 0。我希望能够偶尔生成 -1 和 1。问题是我必须使用 rand 和 srand,作为规范的一部分。任何帮助将不胜感激,并提前感谢:)。

4

3 回答 3

8

怎么样

value = (rand() % 3) - 1;

该表达式rand() % 3生成一个介于02(含)之间的随机数,然后减一得到介于-11(含)之间。

于 2013-03-03T20:17:39.920 回答
2

首先,您需要 3 个不同的值,但您只要求 2 个。其次,在某些实现(显然是您正在使用的那个)中,RAND_MAX == INT_MAX 因此您的计算可能会溢出。您可以使用浮点数来解决这个问题

// srand(time(NULL)); Only do this once per invocation of your program
int value = (int)(3.0*rand()/RAND_MAX) - 1;

或长长

int value = 3LL*rand()/RAND_MAX - 1;

或通过将因子移动到除数中​​:

int value = rand()/(RAND_MAX/3) - 1;

编辑:请注意,由于 RAND_MAX 不是 3 的倍数,因此这些会产生略微偏斜(或多或少,因为 RAND_MAX 或多或少)的结果。您可以通过以下方式避免这种情况:

int r;
do
{
    r = rand();
} while (r >= RAND_MAX/3 * 3);
int value = r / (RAND_MAX/3) - 1;
于 2013-03-03T21:08:41.517 回答
0

您的代码有一个错误,并且可能遭受整数溢出。

改变

value = 2 * rand() / RAND_MAX - 1;

value = rand() / (RAND_MAX / 3 + 1) - 1;
于 2013-03-03T20:22:05.503 回答