在C中用rand()生成了一系列数组,为什么都是一样的???

chris19821010 2003-08-21 09:08:39
程序是这样的:

void Random(int* a,int n)
{
int i,temp;;

srand((unsigned)time(NULL));//好像是C++中的,C中有这个函数吗??

for(i=0;i<n;i++)
{
temp=rand()%10;
a[i]=temp;
}
}

main()
{
int i,j;
int a[10];
for(i=0;i<10;i++)
{
Random(a,10);
for(j=0;j<10;j++)
printf("%4d",a[j]);//结果10个数组都一样???应该怎样使它们不一样呢??
}
}



...全文
144 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bandry 2003-08-21
  • 打赏
  • 举报
回复
上面那个使每个数组中的值都不一样使用的是最笨的方法,有可能造成死循环;更有效的方法是采用置换的方法,先将数组赋值,然后随机掉换数组元素,这样就不会有问题了。
不过这个程序运行还是没有问题的。楼主好好看看
Bandry 2003-08-21
  • 打赏
  • 举报
回复
void Random(int* a,int n)
{
int i = 0, j = 0, temp;

for(i=0;i<n;i++)
{
temp=rand()%10;
for (j = 0; j < i; j++)
{
if (temp == a[j])
{
temp = rand()%10;
j = -1;
}
}
a[i]=temp;
}
}

main()
{
int i,j;
int a[10];

srand((unsigned)time(NULL));//好像是C++中的,C中有这个函数吗??

for(i=0;i<10;i++)
{
Random(a,10);
for(j=0;j<10;j++)
printf("%4d",a[j]);//结果10个数组都一样???应该怎样使它们不一样呢??
printf("\n");
}
return 0;
}

srand()放在那个函数中本就是一个错误;楼上那位,如果不加的话,每次执行程序都会是相同的结果;
如果要使数组中的每个数字都不重复,则需要另外判断;C++大学教程里面有说明(就是那个关于发牌的例子);
JustLikeTheWind 2003-08-21
  • 打赏
  • 举报
回复
SRAND()这个函数你在整个程序中只需要调用一次来初始化种子,一次就够了。
所以你把SRAND()的调用移出void Random(int* a,int n),放到MAIN函数里,并且只调用一次,我保管 你的数列不会再一样了。
给分!
wbh0360 2003-08-21
  • 打赏
  • 举报
回复
哎呀!真是麻烦!
srand()不加也行的啊,我试过了。
fordcot 2003-08-21
  • 打赏
  • 举报
回复
好像是在一定时间内产生的随机数只是在某个范围内,如果时间短,数据相差也小吧!
我也正在学习,不太清楚!!!
chris19821010 2003-08-21
  • 打赏
  • 举报
回复
还有没有其他的方法产成若干个不同的数组呢???
chris19821010 2003-08-21
  • 打赏
  • 举报
回复
调试了 EmailTan() 的第一个程序,结果如下:
0 0 0 0 0 0 0 0 0 0
2 2 2 2 2 2 2 2 2 2
9 9 9 9 9 9 9 9 9 9
......
我要的不是这样的啊???
怎么每个数组内部都一样啊??
test7979 2003-08-21
  • 打赏
  • 举报
回复
因为time函数返回的单位是(秒),除非你两次srand的间隔超过 1 秒,

否则srand的都是同一个数字,后面的随机数列自然一样
simclock 2003-08-21
  • 打赏
  • 举报
回复
但是time(NULL)返回的应该是毫秒级的变化啊,我加了delay(10)都没能管用,加个delay(1000)就管用了,但是得用10秒才能完事儿
test7979 2003-08-21
  • 打赏
  • 举报
回复
因为你的机器太.........快了 :P
chris19821010 2003-08-21
  • 打赏
  • 举报
回复
就是说10次循环时间太短了吗??
maxcai 2003-08-21
  • 打赏
  • 举报
回复
对不起,我现在不方便调试EmailTan的程序,有人帮个忙吗??
你是在网吧里面吗?下个VC装吧——好像很多时间^_^
我调试了,可以的
EmailTan 2003-08-21
  • 打赏
  • 举报
回复
maxcai(cailin)说的对,如果只要srand函数的参数值不同的话,srand放在那里都没有关系。
simclock 2003-08-21
  • 打赏
  • 举报
回复
噢,我明白了!!!

我试了,每次执行循环时time(NULL)产生的unsigned都是一样的。因为速度太快了
maxcai 2003-08-21
  • 打赏
  • 举报
回复
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
void Random(int* a,int n)
{
int i,temp;

srand((unsigned)time(NULL));//好像是C++中的,C中有这个函数吗??

for(i=0;i<n;i++)
{
temp=rand()%10;
a[i]=temp;
}
}

main()
{
int i,j;
int a[10];
for(i=0;i<1000;i++)//现在你看一下屏幕里面的数字是不是有变化呀
{
Random(a,10);
for(j=0;j<10;j++)
printf("%4d",a[j]);//结果10个数组都一样???应该怎样使它们不一样呢??
printf("\n");
}
}
chris19821010 2003-08-21
  • 打赏
  • 举报
回复
对不起,我现在不方便调试EmailTan的程序,有人帮个忙吗??

to maxcai:
我觉得两个程序都有时间差啊??
可以详细说说吗??
maxcai 2003-08-21
  • 打赏
  • 举报
回复
for(i=0;i<10;i++)
{
Random(a,10);
for(j=0;j<10;j++)
printf("%4d",a[j]);//结果10个数组都一样???应该怎样使它们不一样呢??
}
每次rand的种子都是从time(0)开始的,中间发生一点偏移,于是就产生了随机数,但这些偏移是由时间差来产生的,而时间差又是由电脑固定的,对于一个循环来说是一个很短的时间,所以10次循环每次偏移是相同的!
maxcai 2003-08-21
  • 打赏
  • 举报
回复
问题是“时间差”
chris19821010 2003-08-21
  • 打赏
  • 举报
回复
EmailTan
可以解释一下吗???
simclock 2003-08-21
  • 打赏
  • 举报
回复
可是方里面我觉得也应该不一样的阿。
加载更多回复(7)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧