我试图想出一种方法,我可以使用srand和rand随机生成-1,0或1。然而,每当我这样做时,我只能得到生成范围内的值,而不是-1或1。
这就是我的尝试:
int value;
srand(time(NULL));
value=2*rand()/(RAND_MAX)-1;
但是,执行时,我总是生成0.我希望能够偶尔生成-1和1。问题是我必须使用rand和srand,作为规范的一部分。任何帮助将不胜感激,并提前感谢:)。
答案 0 :(得分:8)
怎么样
value = (rand() % 3) - 1;
表达式rand() % 3
会在0
和2
(包括)之间生成一个随机数,然后在-1
和1
之间减去一个{{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;