| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 984 人关注过本帖, 1 人收藏
标题:rand()函数并不能达到真正意义上的产生随机数
只看楼主 加入收藏
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
结帖率:100%
收藏(1)
 问题点数:0 回复次数:1 
rand()函数并不能达到真正意义上的产生随机数
rand()函数并不能达到真正意义上的产生随机数.

我的意思是rand()产生的数是有规律可循的:由同一个种子产生的随机数是固定不变的.

在C语言里,设置种子的函数是void  srand (unsigned seed); .请看下面的几个例程:

/*编译环境vc6.0*/

#include<STDIO.H>
#include<STDLIB.H>
int main()
{
 /*设置种子*/
 srand(1000);
 printf("设置种子为1000后,第一次调用rand()的返回值: %d .\n",rand());
 printf("设置种子为1000后,第二次调用rand()的返回值: %d .\n",rand());
 srand(1000);
 if(rand()==3304)
  printf("设置种子后,第n次调用rand()返回的值是确定的.\n");
 else
  printf("设置种子后,第n次调用rand()返回的值是不确定的.\n");
 if(rand()==8221)
  printf("设置种子后,第n次调用rand()返回的值是确定的.\n");
 else
  printf("设置种子后,第n次调用rand()返回的值是不确定的.\n");
 return 0;
}

结果:

设置种子为1000后,第一次调用rand()的返回值: 3304 .
设置种子为1000后,第二次调用rand()的返回值: 8221 .
设置种子后,第n次调用rand()返回的值是确定的.
设置种子后,第n次调用rand()返回的值是确定的.



/*编译环境TC2.0*/

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main()
{
 clrscr();
 /*set the seed*/
 srand(1000);
 printf("The return value of calling rand() for the first time : %d ,\n",rand());
 printf("after setting the seed that is 1000 .\n");
 printf("The return value of calling rand() for the second time : %d .\n",rand());
 printf("after setting the seed that is 1000 .\n\n");
 srand(1000);
 if(rand()==18625)
 {
  printf("The return value of calling rand() is confirmed, \n");
  printf("after setting the seed.\n");
 }
 else
 {
  printf("The return value of calling rand() is not confirmed, \n");
  printf("after setting the seed.\n");
 }
 if(rand()==14062)
 {
  printf("The return value of calling rand() is confirmed, \n");
  printf("after setting the seed.\n");
 }
 else
 {
  printf("The return value of calling rand() is not confirmed, \n");
  printf("after setting the seed.\n");
 }
 getch();
 return 0;
}

结果:

The return value of calling rand() for the first time : 18625 ,
after setting the seed that is 1000 .
The return value of calling rand() for the second time : 14062 .
after setting the seed that is 1000 .

The return value of calling rand() is confirmed,
after setting the seed.
The return value of calling rand() is confirmed,
after setting the seed.


从以上二个例程中,可以发现在设置种子之后,每次rand()调用是确定的.

基于以上的原因,C语言提供一个用当前时间来设置随机数生成器的种子randomize().作者建议:在重要的程序设计中,不要使用编译器自动生成的种子.
搜索更多相关主题的帖子: rand 随机数 函数 
2008-04-11 22:51
yd4433
Rank: 1
等 级:新手上路
帖 子:404
专家分:0
注 册:2008-3-9
收藏
得分:0 
确实  设置种子之后,每次rand()调用是确定的. HOHO  虽然知道了但是还是 谢谢 LZ 分析了

------...-.-..-...-----........-------.......----.....------....||- - !
2008-04-11 23:14
快速回复:rand()函数并不能达到真正意义上的产生随机数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030178 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved