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

问题描述:

我想弄清楚一种方法,我可以随机使用srand和rand生成-1,0或1。每当我做的,但是,我只能够得到产生的范围内的值,并从不-1或1随机添加-1,0或1到C中的数字

这是我的尝试:

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

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

+1

记得调用'srand(time(NULL));'在你的程序中不要超过一次。特别是不要把它放在一个循环或一个被多次调用的函数中。 – pmg 2013-03-03 20:26:02

如何

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

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

+0

谢谢你帮助这个noob :)!我真的很感激它。 – russ0 2013-03-03 20:23:37

+4

当RAND_MAX%3不是2时,这种方法存在一个很小的偏差。当这是一个问题时,修复通常会在发生最后一个或两个有问题的值(rand()可以采用时丢弃。 – 2013-03-03 20:35:27

+0

'2^n-1 mod 3'永远不会是2,所以对于'RAND_MAX'的许多常见值将会存在偏差。 – harold 2013-03-03 20:42:15

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

变化

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

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

感谢您的回应!我尝试了第二个表达式,但每次都会生成1。 – russ0 2013-03-03 20:29:29

+0

@pmg:好点,我删除了这句话。 – NPE 2013-03-03 20:29:38

首先,你要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; 

或long long

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

或因子移动到除数:

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

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

int r; 
do 
{ 
    r = rand(); 
} while (r >= RAND_MAX/3 * 3); 
int value = r/(RAND_MAX/3) - 1; 
+0

感谢您的回复!出于某种原因,您的所有三条建议每次都会产生-1。我不确定这是为什么,因为你的推理对我来说很合理。 – russ0 2013-03-03 21:21:52

+0

@ user2129657他们在这里工作...... rand()返回什么值,什么是RAND_MAX?可能你的实现没有正确定义RAND_MAX。 – 2013-03-04 00:23:53

+0

@JimBalter,+1试图平均分配结果并显示结果。 – 2013-03-04 01:24:34