C语言生成随机数的函数,为什么循环后随机数都一样?

生成随机数的函数,为什么循环后随机数都一样?

main()

{ char a[100];
int i ;
for(i=0;i<100;i++)
{
srand((unsigned)time(0));
a[i]=rand()%26+97;

}
for(i=99;i>79;i--)
{
printf("%c%c%c%c%c\n",a[i],a[i-20],a[i-40],a[i-60],a[i-80]);
}
getch();
}

为什么输出的字符都是一样的随机数,而不是每个都是不同的随机产生的数?
怎么改?

srand()函数是初始化随机数产生器,它产生随机数种子,说白了就是初始化随机数。

srand((unsigned)time(0));取的是系统时间,也就是距离1970.1.1午夜有多少秒。而for循环每循环一次时间远远小于1秒,这就导致了srand((unsigned)time(0))产生的种子并没有改变。 那么,相同的随机数种子所产生的随机数肯定是一样的了。


扩展资料:

C语言产生随机数的方法:

1,在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。

2,C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。

3,rand()会返回一随机数值,范围在0至RAND_MAX 间。返回0至RAND_MAX之间的随机数值,RAND_MAX定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数,要看你定义的变量类型,int整形的话就是32767。 

4,在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。一般用for语句来设置种子的个数。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-12

    可能的问题原因: 很可能是随机数的种子每次你都设定了同样的值。

    正确的方法:srand需要放在循环之外。

    例子如下:


#include <stdio.h>
#include <openssl/evp.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

main(int argc, char *argv[])
{
        EVP_MD_CTX *mdctx;
        const EVP_MD *md;
        //char mess1[] = "1375844009\n";
        unsigned char md_value[EVP_MAX_MD_SIZE];
        int md_len, i;
        int num;
        int flag=1;
        int count=0;
        unsigned char mess1[65536];
        char d1[65536];
        char dgst[]={'c','f','4'};

        OpenSSL_add_all_digests();
        if(!argv[1]) {
                printf("Usage: mdtest digestname\n");
                exit(1);
        }//end if
        md = EVP_get_digestbyname(argv[1]);
        if(!md) {
                printf("Unknown message digest %s\n", argv[1]);
                exit(1);
        }//end if


        while(flag!=0){
                srand((int) time(NULL));
                num=rand();
                printf("test0 num is '%d'\n",num);
                sprintf(mess1,"%d",num);// mess1 is random
        
                mdctx = EVP_MD_CTX_create();
                EVP_DigestInit_ex(mdctx, md, NULL);
                EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
                EVP_DigestFinal_ex(mdctx, md_value, &md_len);
                EVP_MD_CTX_destroy(mdctx);
        
                //brute-force method: compare the digest  
                flag=strncmp((char*)dgst,(char*)&md_value[0],3);
                //printf("compare digests 0_same,!0_diff: '%d'\n",flag);
                count++;
        }//close while
}//end main

第2个回答  推荐于2017-10-05
怎么改ls的大哥们都说了:就是把scand放到for循环上面,只调用一次就可以了。
至于为什么放在for循环里会产生相同的随机数,我来给你说下吧:

srand()函数是初始化随机数产生器,它产生随机数种子,说白了就是初始化随机数。
srand((unsigned)time(0));取的是系统时间,也就是距离1970.1.1午夜有多少秒。
而for循环每循环一次时间远远小于1秒,这就导致了srand((unsigned)time(0))产生的种子并没有改变。 那么,相同的随机数种子所产生的随机数肯定是一样的了。
您明白了吧?本回答被提问者采纳
第3个回答  2009-07-02

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>

main()

 srand((unsigned)time(0));

 char a[100];

    int i  ;

    for(i=0;i<100;i++)

    {

  a[i]=rand()%26+97;

    }

        for(i=99;i>79;i--)

 {

        printf("%c%c%c%c%c\n",a[i],a[i-20],a[i-40],a[i-60],a[i-80]);

 }

     getch();

}

第4个回答  2020-04-30
如果srand放在循环里面,开始循环,读到rand的时候,srand才会被调用,但是srand里面time的时间精度太低,for已经循环完了,才播种了一次;如果放在外面,进入主函数的时候,就会开始播种,产生不同的种子,这样才能循环出不同的随机数。不知道这样理解对不对?
相似回答