程序大致如下
#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
…..
想每次完全生成完全随机的数。
问一下该怎么样处理呢?
#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
3
rand产生的是伪随机数,其实他是根据一个随机数种子产生了一个序列,由于这个序列周期很长,所以可以认为是伪随机的。
要想每次都产生不同的随机数序列,需要每次运行时初始化随机数种子为一个随机值,通用的方法是采用当前时间做随机数种子,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 首先用当前时间初始化随机数种子
srand(time(NULL));
….
return 0;
}
这只是一种参考方案,也有人用当前进程的ID初始化随机数种子
srand(getpid());
要想每次都产生不同的随机数序列,需要每次运行时初始化随机数种子为一个随机值,通用的方法是采用当前时间做随机数种子,代码如下:
#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函数外,不需要每次产生随机数都重新初始化种子,只需第一次初始即可
应该把srand放在A函数外,不需要每次产生随机数都重新初始化种子,只需第一次初始即可
2
rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是原因是其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。
http://blog.csdn.net/lishuhuakai/article/details/8964852
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