首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

vs2010产生随机数时的一个有关问题

2013-12-26 
vs2010产生随机数时的一个问题头文件bx_suji.h如下:#include stdio.h#include stdlib.h#include time

vs2010产生随机数时的一个问题
头文件bx_suji.h如下:

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

unsigned suijishu(int n)
{
unsigned int i;
srand(time(0));
i = rand()%n;

return i;
}


主程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bx_suiji.h"

void main()
{
char s[4] = {0};
int i=0,n=0;
for(n =0;n<2;n++)
{
for(i=0;i<4;i++)
{
s[i] = 'a'+suijishu(26);
}
for(i = 0;i<4;i++)
{
printf("%c",s[i]);
}
printf("\n");
}
printf("done!\n");

exit(0);
}



程序出现的都是相同的字符,可是在调试时发现没有错误,最后转到crtexe.h,然后结果被覆盖成一样的字符了,很奇怪,求解释。
[解决办法]
srand(time(0));只需要一次就可以了,不用每次都srand(time(0));
不然每次都产生同一个数#include <stdio.h>
#include <stdlib.h>

 
unsigned suijishu(int n)
{
    unsigned int i; 
    // srand(time(0));// 不需要每次都初始化
  
    i = rand()%n;
 
    return i;
}

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bx_suiji.h"
 
void main()
{  
    srand(time(0));// 在这里初始化,就可以了。
    char s[4] = {0};
    int i=0,n=0;
    for(n =0;n<2;n++)
    {
        for(i=0;i<4;i++)
        {
            s[i] = 'a'+suijishu(26);
        }
        for(i = 0;i<4;i++)
        {
            printf("%c",s[i]);
        }
        printf("\n");
    }
    printf("done!\n");
 
    exit(0);
}

[解决办法]
参考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 );
}

热点排行