rand函数生成伪随机数

调用rand()函数前需要调用srand函数

srand函数设置生成一系列伪随机整数的起点。

要重新初始化生成器,需要为srand提供一个随机种子参数。

种子的值都会将生成器设置为随机起点。

我们用时间戳来当作种子 -- srand((unsigned int)time(NULL))

rand检索生成的伪随机数。

通过结果显现现象(来对比一系列代码):

(1)

一旦通过随机种子(时间戳)设置好srand起点,将会通过rand生成一系列真正的伪随机数

注意这里通过随机种子设置srand起点的方式不是调用!!如果这里概念比较模糊,先跳过向后看,就可以理解了。

//真正的伪随机
int main()
{
    srand(time(NULL));
    while (1)
    {
        int num1 = rand();
        int num2 = rand();
        printf("%d %d\n", num1, num2);
    }
    return 0;
}

 (2)

如果多次通过调用的方式设置srand起点,且每次设置时间小于1s,那么在这1s内, rand函数生成值相同,直到下一秒。 总结为:srand起点每1s重新设置一次

//错误示范1
int main()
{
    while (1)
    {
        srand(time(NULL));
        int num1 = rand();
        int num2 = rand();
        printf("%d %d\n", num1, num2);
    }
    return 0;
}

(3)

用固定值来作为种子来设置srand起点,rand生成的值永远不变。

错误示范2:
int main()
{
    while (1)
    {
        srand(1);
        int num1 = rand();
        int num2 = rand();
        printf("%d %d\n", num1, num2);
    }
    return 0;
}

(4)

以下是两次运行结果,不难看出,单次看似随机,实际每次运行rand生成值对应相等 其原因就是没有使用srand设置起点,默认起点为种子为1的srand起点。

错误示范3:
int main()
{
    while (1)
    {
        int num1 = rand();
        int num2 = rand();
        printf("%d %d\n", num1, num2);
    }
    return 0;
}

 总结

水平有限,就用通俗一点的话来解释吧。

且暂时理解为:

1.

提供给srand的种子如果固定,rand永远不变。

2.

通过时间戳作为种子,在1s内多次通过调用设置srand起点,实际上srand每隔1s才能通过调用改变一次起点,

相当于在1s内没有更改种子值,导致1s内多次设置同一种子的起点,故结果与1相同,rand在1s内永不变

3.

通过时间戳作为种子,设置好srand起点后,在1s内不改变起点或者在1s后改变起点,rand生成值永远是随机值

4.

如果不提供srand起点,rand每次生成值虽然看似随机,但实际当多次运行程序时,发现每次运行后,生成值一一对应相等。

5.

通过时间戳作为种子,srand每次重新调用设置的起点间隔是1s!注意是重新调用!但是一旦设置好起点,每次生成srand起点间隔就是非常小,不知道确切的值但一定小于1s。

注意:最容易混淆的一个点就是!

是通过调用srand函数来设置srand起点,

还是通过srand函数自身种子参数的变化来设置起点。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值