c++ 产生不同随机数

来源:百度知道 编辑:UC知道 时间:2024/06/06 03:44:56
用c++如何产生不同的随机数?
#include<iostream>
#include<ctime>
#include<cmath>

int main()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{

srand((unsigned)time( NULL ) );

printf("%d ",rand());
}
printf("\n");

}
return 0;
}

用上述程序产生的是100个随机数是相同的,原因是它们几乎是在同一秒内完成的,因此时间种子是相同的,产生的随机数就相同。
如何改进,让这一百个随机数不同呢?
不要用Sleep,这样太浪费时间。
2l说的很对,能不能给我讲讲为什么放在外面就可以了。

原因很简单,要产生不同的数,并不需要每一次调用rand()前都进行srand改变种子,事实上种子只需要在程序开始之初初始化一次就足够了,后面的rand会随即取数。
相反的,如果象你这样把srand放到循环体里面,就等于每一次rand前的种子都进行了一次初始化,而且循环的时间非常短,time获取到的种子全部相同,故而产生的数字都是一样的。time(0)返回的是系统的时间(从1970.1.1午夜算起),单位:秒,而那个循环运行起来耗时连0.000001秒都不到! 也就是说,srand(time(0)) 连着20次的种子是一样的,种子一样,生产的随机数当然是一样了。

srand((unsigned)time( NULL ) );
修改为
Sleep(2);//这样不浪费时间的.100个随机数用200毫秒,够小的了.
srand((int)(time(0)-getpid()));
=====
我认为更好的一种方法.可以利用GUID来生成.
//--生成GUID的代码
//--相关程序/微软guidgen.exe

#include "stdafx.h"
#include <objbase.h>
#include <stdio.h>

//--生成GUID
const char* newGUID()
{
static char buf[64] = {0};
GUID guid;
if (S_OK == ::CoCreateGuid(&guid))
{
_snprintf(buf, sizeof(buf)
, "{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0], guid.Data4[1]
, guid.Data4[2],