我想弄清楚一种方法,我可以随机使用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作为规范的一部分。任何帮助将不胜感激,并在此先感谢:)。
我想弄清楚一种方法,我可以随机使用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作为规范的一部分。任何帮助将不胜感激,并在此先感谢:)。
如何
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;
或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;
感谢您的回复!出于某种原因,您的所有三条建议每次都会产生-1。我不确定这是为什么,因为你的推理对我来说很合理。 – russ0 2013-03-03 21:21:52
@ user2129657他们在这里工作...... rand()返回什么值,什么是RAND_MAX?可能你的实现没有正确定义RAND_MAX。 – 2013-03-04 00:23:53
@JimBalter,+1试图平均分配结果并显示结果。 – 2013-03-04 01:24:34
记得调用'srand(time(NULL));'在你的程序中不要超过一次。特别是不要把它放在一个循环或一个被多次调用的函数中。 – pmg 2013-03-03 20:26:02