随机添加-1,0或1到C中的数字

时间:2013-03-03 20:14:54

标签: c random numbers range generator

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

这就是我的尝试:

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

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

3 个答案:

答案 0 :(得分:8)

怎么样

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

表达式rand() % 3会在02(包括)之间生成一个随机数,然后在-11之间减去一个{{1}}

答案 1 :(得分: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;

答案 2 :(得分:0)

您的代码有一个错误的错误,可能会遇到整数溢出。

更改

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

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