发布网友 发布时间:2022-04-20 11:49
共5个回答
热心网友 时间:2023-09-07 09:14
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语句来设置种子的个数。
热心网友 时间:2023-09-07 09:15
可能的问题原因: 很可能是随机数的种子每次你都设定了同样的值。
正确的方法: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
热心网友 时间:2023-09-07 09:15
怎么改ls的大哥们都说了:就是把scand放到for循环上面,只调用一次就可以了。
至于为什么放在for循环里会产生相同的随机数,我来给你说下吧:
srand()函数是初始化随机数产生器,它产生随机数种子,说白了就是初始化随机数。
srand((unsigned)time(0));取的是系统时间,也就是距离1970.1.1午夜有多少秒。
而for循环每循环一次时间远远小于1秒,这就导致了srand((unsigned)time(0))产生的种子并没有改变。 那么,相同的随机数种子所产生的随机数肯定是一样的了。
您明白了吧?
热心网友 时间:2023-09-07 09:16
#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();
}
热心网友 时间:2023-09-07 09:17
如果srand放在循环里面,开始循环,读到rand的时候,srand才会被调用,但是srand里面time的时间精度太低,for已经循环完了,才播种了一次;如果放在外面,进入主函数的时候,就会开始播种,产生不同的种子,这样才能循环出不同的随机数。不知道这样理解对不对?