C语言中 srand(time(0)) 和 rand()

参考文献:

https://blog.youkuaiyun.com/kongfanyu/article/details/6387642

https://www.cnblogs.com/xiaoxiaoxin-love-ping/p/3528849.html


计算机没有办法产生真正的随机数的,是用算法模拟,所以你只调用rand,每次出来的东西是一样的。设置一个种子后,根据种子的不同,就可以产生不同的数了。而怎么保证种子的不同呢?最简单的办法当然是用永远在向前的时间。


srand(time(0)) ;//先设置种子
rand();//然后产生随机数
Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一样。为了每回种下一个不一样的种子,所以就选用Time(0),Time(0)是得到当前时时间值(因为每时每刻时间是不一样的了)。

srand(time(0)) ;
就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数, 
用1970.1.1至今的秒数,初始化随机数种子。


参考案例

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

void main( void )
{
    int i;
    
    srand(time(0));
    
    /* 输出 10 个随机数. */
    for( i = 0;   i < 10;i++ )
        printf( "  %6d/n", rand() );
}


输出结果:

   22614
   15772
   30620
   24913
    7556
   31659
   27876
   27229
   25083
   16564
Press any key to continue


如何使得生成出在[0,6)之间 的随机数呢?

将rand()的返回值与6求模是必须的,这样才能确保目的随机数落在[0,6)之间,否则rand()的返回值本身可能是很巨大的。
一个通用的公式是:
要取得[a,b)之间的随机整数,使用(rand() % (b-a))+ a (结果值将含a,不含b)。
在a为0的情况下,简写为rand() % b

 

### C语言 `srand` `rand` 函数的使用方法及区别 #### 使用方法 在C语言中,为了生成随机数,通常会一起使用两个函数:`srand()``rand()`。 - **设置随机数种子** `srand(unsigned int seed)`用于初始化随机数发生器。通过传递一个无符号整型参数作为种子(seed),可以控制后续调用`rand()`所产生的序列[^1]。 ```c #include <stdlib.h> #include <time.h> int main() { // 设置当前时间为种子 srand((unsigned) time(NULL)); } ``` 这段代码展示了如何基于系统时间来设定种子值,从而使得每次运行程序时都能获得不同的随机数序列。 - **获取随机数值** `rand(void)`返回一个介于0到`RAND_MAX`之间的伪随机整数。如果不事先调用`srand()`设置种子,则默认情况下将以固定值(通常是1)作为种子,这会导致多次执行相同程序时产生的随机数序列一致[^3]。 ```c // 获取一个0~99间的随机整数 int randomNumber = rand() % 100; printf("Random Number between 0 and 99 is: %d\n", randomNumber); ``` 上述例子说明了怎样利用取模运算符(`%`)限制随机数的范围,在这里是从0到99之间选取一个随机整数并打印出来。 #### 区别 - **作用差异** - `srand()`的作用在于提供给定的种子值以影响之后由`rand()`生成的具体随机数列;而`rand()`则是实际负责生产这些看似随机分布的数据点。 - **依赖关系** - 虽然两者经常被联合起来应用,但是它们各自独立工作——只有当希望改变或定制化随机数流的时候才需要用到`srand()`去重新播种新的种子。如果没有显式地调用过`srand()`,那么第一次遇到`rand()`时将会自动采用预定义好的初始状态(即seed=1),这意味着除非另有指示,否则所有应用程序实例都将遵循同样的模式生成所谓的“随机”数据集。 - **性能考量** - 对于大多数应用场景而言,频繁更改种子并不是必要的操作,因此一般只需要一次性的调用`srand()`即可满足需求。而且值得注意的是,过于频繁地更新种子反而可能破坏原本期望达到的良好统计特性[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值