如何在每次while循环时 都产生不同的 随机数?谢谢!

dreamzhenzhen 2013-03-30 05:27:13
请问如何在每次while循环时 rand()函数都可以自动的产生一个不同的随机数。
因为我用的是time()函数产生随机数的种子,所以,rand()每隔一秒才会产生一个不同的随机数,而一秒内产生的都是相同的随机数,导致while在某一秒内都会重复执行相同的内容。 非常感谢大家!!
一秒内产生的随机数都相同

一秒后才会产生其他的随机数

程序如下:
#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
...全文
879 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-04-02
  • 打赏
  • 举报
回复
srand需要且只要在程序初始化时调用一次! C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c
/***
*rand.c - random number generator
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

/***
*void srand(seed) - seed the random number generator
*
*Purpose:
*       Seeds the random number generator with the int given.  Adapted from the
*       BASIC random number generator.
*
*Entry:
*       unsigned seed - seed to seed rand # generator with
*
*Exit:
*       None.
*
*Exceptions:
*
*******************************************************************************/

void __cdecl srand (
        unsigned int seed
        )
{
        _getptd()->_holdrand = (unsigned long)seed;
}


/***
*int rand() - returns a random number
*
*Purpose:
*       returns a pseudo-random number 0 through 32767.
*
*Entry:
*       None.
*
*Exit:
*       Returns a pseudo-random number 0 through 32767.
*
*Exceptions:
*
*******************************************************************************/

int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}
WGL__WGL 2013-04-02
  • 打赏
  • 举报
回复
受教了
derekrose 2013-04-02
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/ms177610.aspx
dreamzhenzhen 2013-04-02
  • 打赏
  • 举报
回复
谢谢各位了!
ytlcainiao 2013-03-30
  • 打赏
  • 举报
回复
加个种子发生器 srand((unsigned)time(NULL))
大极张三疯 2013-03-30
  • 打赏
  • 举报
回复
引用 2 楼 dreamzhenzhen 的回复:
果然好使哎,这是为什么呢? 另外 我怎么才可以给您的回帖给分呢? @lin5161678 谢谢
结帖就行了,你会看到的
Athenacle_ 2013-03-30
  • 打赏
  • 举报
回复
为什么呢? 因为srand放在循环里,循环运行太快,每次获得的随机数种子相同,产生一样的随机数
dreamzhenzhen 2013-03-30
  • 打赏
  • 举报
回复
果然好使哎,这是为什么呢? 另外 我怎么才可以给您的回帖给分呢? @lin5161678 谢谢
lin5161678 2013-03-30
  • 打赏
  • 举报
回复
我就知道一定是这样
while(flag!=0){
srand((int) time(NULL));
num=rand();
你把
srand((int) time(NULL));
放在循环外部就没事了 这样
srand((int) time(NULL));
while(flag!=0){
num=rand();

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧