一个随机数问题

linxingyu404 2010-03-03 05:03:01
#include   <stdio.h>   
#include <stdlib.h>
#include <time.h>

int main ()
{
int i,num;
srand((int)time(0));
for(i=0;i<=5;i++)
{
num=10*rand()/(RAND_MAX+1);
printf("%d\n",num);
}

return 0;
}
这是一个随机输出数字的程序,应该是对的,一共输出6个数字,但是为什么我的第一个数字每次运行都相同?

还有一个问题,srand()需要一个种子,也就是(int)time(0),那他的精度是多少,换句话说,过了1秒,这个(int)time(0)会变吗?还是过一分钟才会变。
...全文
299 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yao90928 2010-03-16
  • 打赏
  • 举报
回复
学习了。。。
「已注销」 2010-03-16
  • 打赏
  • 举报
回复
不太理解
num=10*rand()/(RAND_MAX+1)
这句楼主到底想干什么?
RAND_MAX+1的是2147483647
想不通楼主除以这么大的数再取整后,我觉得大部分情况应该是零的
aimsam 2010-03-16
  • 打赏
  • 举报
回复
/*随机数*/
#include <stdio.h>

static unsigned long int next = 1;
int rand0(void)
{
next = next * 1103515245 + 12345;//魔术公式
return (unsigned int) (next / 65536) % 32768;
}

void srand0(unsigned int seed)//设置SEED
{
next = seed;
}


帖个书上给的函数原型。。不过本人不理解到底是怎么算的。。求解

KingRumn 2010-03-14
  • 打赏
  • 举报
回复

time的返回值是以1秒为精度的,
rand产生的是伪随机数列,第一个数依赖设置的种子,后面的数根据某个递推公式递推,
所以在设置好种子后,第一次rand的返回值依赖于种子,由于两次运行之间的时间相对差别不大,那么返回值差别就不是很大,经过你的乘除之后就变成了一个数,楼主若非要得到看似不同的随机数,可以换一种方式,
num=rand()%10
就好了
就是把num的依赖变成rand()返回值的最后一位,那么就相对随机了。
jbz001 2010-03-14
  • 打赏
  • 举报
回复
这样弄吧


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
int i,num;
srand((int)time(0));
rand();
for(i=0;i<=5;i++)
{
num=10*rand()/(RAND_MAX+1);
printf("%d\n",num);
}

return 0;
}



Samoon 2010-03-14
  • 打赏
  • 举报
回复
num=10*rand()/(RAND_MAX+1);
改为num = 1+(int)(10.0*rand()/(RAND_MAX+1.0));
看看
会不会是类型转换的问题?
jacey_48557 2010-03-13
  • 打赏
  • 举报
回复

LZ:哪里有这部分知识的学习?


XIEXIE
linxingyu404 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 z15881328993 的回复:]
因为你没设置种子,rand是带参数的函数,默认参数0
[/Quote]看清楚再说
z15881328993 2010-03-12
  • 打赏
  • 举报
回复
因为你没设置种子,rand是带参数的函数,默认参数0
linxingyu404 2010-03-12
  • 打赏
  • 举报
回复
再顶,还没有答案
bluemystery 2010-03-09
  • 打赏
  • 举报
回复
10楼的方法 没用
继续关注中
  • 打赏
  • 举报
回复

int main ()
{
int i,num,res;
srand((int)time(0));
for(i=0;i<=5;i++)
{
res=rand();
num=10*res/(RAND_MAX+1);
printf("%d\n",res);
}

return 0;
}




改成这样可以看到,每次随机到的数字是不一样的。


应该是第一个数总是满足这个式子,num=10*rand()/(RAND_MAX+1);

yuzl32 2010-03-06
  • 打赏
  • 举报
回复
num=10*rand()/(RAND_MAX+1);
-------------
按这种方式,也就是说只要随机数的千位数一样,其值就一样。
linxingyu404 2010-03-06
  • 打赏
  • 举报
回复
引用 10 楼 hairetz 的回复:
C/C++ codeint main ()
{int i,num,res;
srand((int)time(0));for(i=0;i<=5;i++)
{
res=rand();
num=10*res/(RAND_MAX+1);
printf("%d\n",res);
}return0;
}

改成这样可以看到,每次随机到的数字是不一样的。


应该是第一个数总是满足这个式子,num=10*rand()/(RAND_MAX+1);


没用啊,你们没发现每次第一个数都差不多吗?
快乐老头儿 2010-03-04
  • 打赏
  • 举报
回复
这个复杂了。你看一下rand函数的函数体,仔细分析分析,应该能看出问题。其实rand是有很多规律的(比如奇数,偶数排序等),因此它是有缺陷的。也就是说要想真正的使用随机数,还需要在rand的基础上用其他的方法实现。另外,.net,vb,java的随机数算法也都是不一样的。
fiveyes 2010-03-04
  • 打赏
  • 举报
回复
你可以把这一行:
num=10*rand()/(RAND_MAX+1);
试着改成:num = rand();
就可以看到,每次输出的第1个数总是在一定范围内

(我刚才试了几次,第1个都是800多,隔一段时间后再试,几次都在1200多,又隔了几分钟再试,第1个数都是1900多)

RAND_MAX是一个比较大的数,用这生成的第1个数除以这个RAND_MAX,得到的结果总是接近0,取整就是0了。

最后我认为7楼的话非常有道理,值得注意。
linxingyu404 2010-03-03
  • 打赏
  • 举报
回复
引用 3 楼 cattycat 的回复:
num=rand()%10;
你是要产生小于10的数字吗,这样比较好。

用你的方法确实有效,但是如果就num=rand()来看的话会发现每次随机输出的第一个数都差不多吧,也就个位和十位发生变化。我第一个数9248;然后每次运行都差不多。所以用我原来的方法不行,用你的方法可以。

但是为什么会这样子??
快乐老头儿 2010-03-03
  • 打赏
  • 举报
回复
如果lz删除/(RAND_MAX+1)的话,就会发现得到的是正确的随机数。
如果想得到1-10之间的随机数的话,应当这样做 printf("%3d ",rand()%10+1);
RAND_MAX是rand()返回的最大值,你用它作了除法运算,因此造成返回值不精确了。
macrojj 2010-03-03
  • 打赏
  • 举报
回复
#include   <stdio.h>   
#include <stdlib.h>
#include <time.h>

int main ()
{
int i,num;
srand((int)time(0));
for(i=0;i<=5;i++)
{
num=rand()%10;
printf("%d\n",num);
}

return 0;
}


不过我想知道为什么你的办法不行呢
cattycat 2010-03-03
  • 打赏
  • 举报
回复
num=rand()%10;
你是要产生小于10的数字吗,这样比较好。
加载更多回复(2)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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