rand()随机数问题。请教

C++语言 码拜 4年前 (2016-09-23) 454次浏览
程序大致如下
#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
…..
想每次完全生成完全随机的数。
问一下该怎么样处理呢?
解决方案

5

由于程序执行时间短,每次srand的参数是一样的,因此随机序列不变,该函数应放在主函数只执行一次。

5

读取 CPU 内核时间
作为srand 的参数
或 读取pid 跟 当前时间相加 作为 srand 参数
则  每次启动,随机数序列,应该是 不一样的
C++ 用新的随机数类,更好

3

rand产生的是伪随机数,其实他是根据一个随机数种子产生了一个序列,由于这个序列周期很长,所以可以认为是伪随机的。
要想每次都产生不同的随机数序列,需要每次运行时初始化随机数种子为一个随机值,通用的方法是采用当前时间做随机数种子,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 首先用当前时间初始化随机数种子
srand(time(NULL));
….
return 0;
}
这只是一种参考方案,也有人用当前进程的ID初始化随机数种子
srand(getpid());

8

srand((unsigned)time(NULL)); time(NULL)所取得的时间只能精确到秒,而循环所花费的时间显然远远低于这个数量级,所以每次得到的time是一样的,故结果一样
应该把srand放在A函数外,不需要每次产生随机数都重新初始化种子,只需第一次初始即可

2

rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是原因是其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。
http://blog.csdn.net/lishuhuakai/article/details/8964852

2

仅供参考:

#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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明rand()随机数问题。请教
喜欢 (0)
[1034331897@qq.com]
分享 (0)