●●请问随机数是怎样产生的?●●

whjpn 2003-04-10 04:33:20
MSDN里的一个经典的例子∶

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

void main( void )
{
int i;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
printf( " %6d\n", rand() );
}
我现在没明白,rand()函数是如何与种子数time取得联系的?也就是说,
srand( (unsigned)time( NULL ) )这句代码和rand()是怎么联系的?



...全文
38 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
skiptomylou 2003-04-11
  • 打赏
  • 举报
回复
faint
rand的参数不是void么,所以srand(int seed)+rand(void)==Rand(int seed),不是非要看到源码吧,理解了就可以了
whjpn 2003-04-10
  • 打赏
  • 举报
回复
也感谢溪西,
但我还是没明白∶
srand() 产生了种子数,这个种子数保存在哪里?
rand()是要用到这个种子数的,它到哪里去取这个种子数?

打个比方∶
先取得srand()产生的种子数∶
seed = srand();
然后利用这个种子数,产生随机数∶
rand(seed);

不知道这样打比方合不合适。

总之一个意思∶srand() 与rand()之间的纽带是什么?
skiptomylou 2003-04-10
  • 打赏
  • 举报
回复
来自vchelp

用VC产生随机数有两个函数,一个是Rand一个是Srand,我的用法是这样的,先调用srand函数,如srand( (unsigned)time( NULL ) ),这样可以每次产生的随机数序列不同。因为各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的(这便是为什么单独使用Rand产生的随机数是一样的原因)。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL )),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函 数来人为指定种子数。Windows 9x/NT的 游 戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次
whjpn 2003-04-10
  • 打赏
  • 举报
回复
狐狸说的我明白,我的意思是∶
srand() 与rand()之间的纽带是什么?
srand() 与rand()之间可没有传递任何变量啊!

fingerfox 2003-04-10
  • 打赏
  • 举报
回复
设一个随机数的种子,
否则取出来的随机数是相同的
:)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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