使用了种子srand()后,每次第一个随机数都相同

怎么每次运行程序时生成的第一个随机数都是一样的?从第二个开始才有变化。比如我第一次运行程序生成的随机序列是 8 2 1 8 2 14,关闭后再次运行得到随机序列 8 17 4 13 4 9,每次得到的随机序列第一个数都是8
我的意思是,虽然把随机的范围扩大后,每次运行时生成的随机序列的第一个数有区别了,但还是比较接近的,比如第一次是4569、第二次是4571、第三次是4576,每次运行这个数一点一点增长,这个和 种子取自系统时间 有关吧
-----------------------------
真是这样,我改成10000后终于有差别了,果然还是种子的问题,多谢二位了,不过都答对了,分给谁啊
--------------------------
我是这么用的,版本是vc6,我试了很多次,不像是概率问题
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

void main()
{
//int i,j;
char input_a[5],input_b[5];
char s[5];
int num=100;

srand( (unsigned)time( 0 ) );

while(num>0 )
{
scanf("%s",input_a);

int a=1+(int)(20.0*rand()/(RAND_MAX+1.0));
printf("a is %d\n",a);

num-=a;

}
}

基本上来说这是rand()伪随机函数的一个弊端,rand()中是一个已经定义好的序列,根据你传入的种子,然后产生不同的序列,这种问题,好像没有好的办法解决.

---------------------
你那不叫种子问题,是你在取随机数时,范围取小了,比如说改成2,那么只有1和2这两种,如果取成3,那就是1,2,3比前面的好点,一直这样下去就知道了.
设种子是没问题的.
恭喜恭喜,问题解决了,至于分,随便你给了,不知另一个兄弟是哪位,呵呵.

---------------------
(int)(20.0*rand()/(RAND_MAX+1.0));
因为你取的值太小了,将20.0改成1000再尝试下应该能看出点什么的,不行的话再修改大些.

-------------------
概率性问题而已.

-----------------
也许是巧合也许是必然,这个要看rand()的实现了.

不过既然是随机,你可以不用去太理会第一个数是否一样吧?如果你多次测试下均如此,可以跳过第一个数据.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-03-10
使用srand()函数的目的就是为了每次得到不同的值,出现你这种情况有两个可能:

1.可能是你的调用方式有误,请写出你的完整程序。

2.随机数函数rand()确实有可能在你调用的两次都返回了相同的值,这种可能性是存在的(虽然机率较小)。

********************************************

请写出完整程序,尤其是包含的头文件和srand()的调用方式

********************************************

问题出在
1+(int)(20.0*rand()/(RAND_MAX+1.0));

因为其中有除法运算,所以在rand()返回值相差不大的时候,由于精度问题,这个式子就会返回同样的值,在这个前提下,如果两次运行程序的间隔较小,那么第一次rand()的返回值极有可能相差不大,所以会出现这个问题。
相似回答