我试图找出一种可以使用 srand 和 rand 随机生成 -1,0 或 1 的方法。但是,每当我这样做时,我只能获得生成范围内的值,而不能获得 -1 或 1。
这是我尝试过的:
int value;
srand(time(NULL));
value=2*rand()/(RAND_MAX)-1;
但是,执行时,我总是生成 0。我希望能够偶尔生成 -1 和 1。问题是我必须使用 rand 和 srand,作为规范的一部分。任何帮助将不胜感激,并提前感谢:)。
怎么样
value = (rand() % 3) - 1;
该表达式rand() % 3
生成一个介于0
和2
(含)之间的随机数,然后减一得到介于-1
和1
(含)之间。
首先,您需要 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;
您的代码有一个错误,并且可能遭受整数溢出。
改变
value = 2 * rand() / RAND_MAX - 1;
到
value = rand() / (RAND_MAX / 3 + 1) - 1;