C/C++_关于rand()和srand()的调用方式的一点探究

C语言中srand如果在一个函数中调用能否对另一个函数中的rand产生影响?

一直在搞的一个项目中,自己在改一个R语言的包。包的底层用的是C语言,我想要在运行过程中用到真随机数,所以必须用srand

我今天想要探索的就是,如果我专门声明一个函数set_Srand(),他的唯一作用就是srand((int)time(0));,那么我后面所有其他函数中的rand是否都会产生真随机数呢?

以下是4个测试,如果不想看可以直接拉到最底下看结论。

(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

测试1

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

int main()
{
    int i,j;
    for(i=0;i<10;i++)
    {
        j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
        printf("%d ",j);
    }
    return 0;
}

输出:

 ~/myDocuments/Coding/c $ gcc randtest.c -o randtest
 ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %     
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
1 2 8 5 6 3 1 7 7 10 %              
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
1 2 8 5 6 3 1 7 7 10 %

测试2

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
    srand((int)time(0));
}
void printRand(){
    int i,j;
    for(i=0;i<10;i++)
    {
        j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
        printf("%d ",j);
    }
}
int main()
{
    //set_Srand();
    printRand();
    return 0;
}

输出:

 ~/myDocuments/Coding/c $ gcc randtest.c -o randtest
 ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %     
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
1 2 8 5 6 3 1 7 7 10 %              
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
1 2 8 5 6 3 1 7 7 10 %(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)

测试3

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
    srand((int)time(0));
}
void printRand(){
    int i,j;
    for(i=0;i<10;i++)
    {
        j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
        printf("%d ",j);
    }
}//(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
int main()
{
    set_Srand();
    printRand();
    return 0;
}

输出:

 ~/myDocuments/Coding/c $ gcc randtest.c -o randtest
 ~/myDocuments/Coding/c $ ./randtest
5 9 10 10 8 6 1 5 1 2 %   
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
5 10 8 4 4 8 2 2 8 2 %              
 ~/myDocuments/Coding/c $ ./randtest                                                                                                                                                                           
5 3 3 3 4 3 3 6 2 10 %              
 ~/myDocuments/Coding/c $ ./randtest                                                                                                            
5 6 8 3 5 7 4 9 5 9 %

测试4

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
    srand((int)time(0));
}
void printRand(){
    int i,j;
    for(i=0;i<10;i++)
    {
        j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
        printf("%d ",j);
    }
}
int main()
{
    printRand();//(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
    printf("\n");
    set_Srand();
    printRand();
    return 0;
}

输出:

 ~/myDocuments/Coding/c $ gcc randtest.c -o randtest
 ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 6 1 2 9 6 9 7 6 2 %                                                                                                                           ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 9 6 1 10 10 10 1 10 1 %                                                                                                                       ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 2 1 10 1 5 1 4 4 10 %                                                                                                                         

结论

答案是可以的,我们可以专门声明一个函数,唯一作用就是srand((int)time(0));,使后面所有其他函数中的rand都产生真随机数

但是注意定语是“后面”,也就是必须把设置srand的子函数的调用地点放在其他用到rand的子函数的调用的前面,不然在srand之前的所有rand返回的值都不是真随机数而是一致的了!

(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)


visitor tracker
访客追踪插件


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值