rand()随机数问题。求教。。。。。

TJTUM 2016-09-12 05:10:44
程序大概如下
#include <stdlib.h>
#include <time.h>
using namespace std;
int MAX = 10000;
class a
{
void A();
void B(......);
}

void a::A()
{
srand((unsigned)time(NULL));
std::vector<int> m(4);

m[0] = rand()%MAX;
m[1] = rand()%MAX;
m[2] = rand()%MAX;
B(m);
}

void a::B(..................)
{
m[3] = rand()%MAX;
}

main()
{
执行N次A函数。
}


Release版本生产.exe执行文件。
然后每次运行.exe, m都是一样的
比如第一次运行:
m=
1 2 3 4
5 6 7 8
...
第二次运行.exe文件,m 同样是
m=
1 2 3 4
5 6 7 8
.....

然后试了从新生产.exe文件,第二次生产的.exe文件m还是
m=
1 2 3 4
5 6 7 8
.....


想每次完全生成完全随机的数。
请问该如何处理呢?
...全文
242 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-13
  • 打赏
  • 举报
回复
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 );
}
ooolinux 2016-09-12
  • 打赏
  • 举报
回复
srand(GetTickCount());
赵4老师 2016-09-12
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"ole32")
#include <objbase.h>
#include <stdio.h>
union U {
    GUID            guid;
    unsigned char   b[16];
} u;
int i;
char s[33];
void main() {
    if (S_OK!=CoCreateGuid(&u.guid)) return;
    for (i=0;i<16;i++) sprintf(s+i*2,"%02x",u.b[i]);
    printf("GUID=%s\n",s);//每次结果都不一样
}
//GUID=f5a44443aa5fb1479bf6741fa213d33c
小灸舞 2016-09-12
  • 打赏
  • 举报
回复
rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。
http://blog.csdn.net/lishuhuakai/article/details/8964852
paschen 版主 2016-09-12
  • 打赏
  • 举报
回复
srand((unsigned)time(NULL)); time(NULL)所取得的时间只能精确到秒,而循环所花费的时间显然远远低于这个数量级,所以每次得到的time是一样的,故结果一样 应该把srand放在A函数外,不需要每次产生随机数都重新初始化种子,只需第一次初始即可
hijack00 2016-09-12
  • 打赏
  • 举报
回复
rand产生的是伪随机数,其实他是根据一个随机数种子产生了一个序列,由于这个序列周期很长,所以可以认为是伪随机的。 要想每次都产生不同的随机数序列,需要每次运行时初始化随机数种子为一个随机值,通用的方法是采用当前时间做随机数种子,代码如下: #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 首先用当前时间初始化随机数种子 srand(time(NULL)); .... return 0; } 这只是一种参考方案,也有人用当前进程的ID初始化随机数种子 srand(getpid());
lm_whales 2016-09-12
  • 打赏
  • 举报
回复
读取 CPU 内核时间 作为srand 的参数 或者 读取pid 跟 当前时间相加 作为 srand 参数 则 每次启动,随机数序列,应该是 不一样的 C++ 用新的随机数类,更好
tbooka 2016-09-12
  • 打赏
  • 举报
回复
由于程序执行时间短,每次srand的参数是一样的,因此随机序列不变,该函数应放在主函数只执行一次。

64,690

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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