srand作用域问题

MagicFuzzX 2014-07-28 05:36:33
为什么

srand((unsigned)time(NULL));
for (int i = 0; i < 10; ++i)
{
//srand((unsigned)time(NULL));
double pi2 = (double)rand() / (double)(RAND_MAX);

std::cout <<pi2 << std::endl;
int n = 11;
}

这样生成的随机数确实是0-1的double类型
将srand移到循环里面确生成的随机数都是一样的

//srand((unsigned)time(NULL));
for (int i = 0; i < 10; ++i)
{
srand((unsigned)time(NULL));
double pi2 = (double)rand() / (double)(RAND_MAX);

std::cout <<pi2 << std::endl;
int n = 11;
}


srand控制的范围有多大?能不能在main函数设置一下,然后在里面调用的子函数里面用rand生成随机数?
...全文
187 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ID870177103 2014-07-28
  • 打赏
  • 举报
回复
[
#include <stdio.h>
#include <time.h>

const unsigned long a = 7791 ;
const unsigned long b = 1701 ;
const unsigned long c = 1912 ;
static unsigned long r ;

int m_srand (unsigned long s)
{
	r = s ;
	return 0 ;
}

unsigned long m_rand ()
{
	r = (a * r + b) % c ;
	r &= 0x7fff ;
	return r ;
}

int main ()
{
	int i ;
	double d ;

	m_srand (time (0)) ;
	for (i = 0 ; i < 100 ; i++)
	{
		d = (double) m_rand () / 0x7fff ;
		printf ("%lf\n" ,d) ;
	}

	return 0 ;
}
因为库函数叶返回的是一个周期较长的周期函数值 ,所以说库函数也是用线性同余式得到伪随机数的 ,但是应该经过某种优化 ,而有较好的随机性吧 由以上代码可看出srand作用域是全局的吧
ranky2009 2014-07-28
  • 打赏
  • 举报
回复
如果你在srand中输入的数值相同,那么srand后面产生的rand也是相同的。

srand(8);
for (int i = 0; i < 10; ++i)
{
    double pi2 = (double)rand() / (double)(RAND_MAX);

    std::cout <<pi2 << std::endl;
}
用以上代码,你会发现每次debug输出的数值是一样,这是因为我设置的srand函数的输入都为8,所以每次debug输出值都是一样的序列。 time(NULL)是取当前时间,当你把srand((unsigned)time(NULL));放在for循环中时,由于一个for循环的时间极短,所以所有的time(NULL)的返回值相同,因此rand()的值也就相同。 当你在main函数设置srand((unsigned)time(NULL));时,影响的将是所有的rand,所以,所有子函数rand()都成随机的,你可以这样用。
神奕 2014-07-28
  • 打赏
  • 举报
回复
如果你一定要把srand放在循环体内的话,需要每次提供不一样的种子,可以把i当作种子:

for (int i = 0; i < 10; ++i)
{
    srand((unsigned)i);
    double pi2 = (double)rand() / (double)(RAND_MAX);
 
    std::cout <<pi2 << std::endl;
    int n = 11;
}
return 0;
神奕 2014-07-28
  • 打赏
  • 举报
回复
因为你循环10次基本是一瞬间完成的,time(NULL)提供的随机数种子是一样的,所以每次循环生成的随机数序列是一样的,而每次都是输出随机数序列的第一个数,所以全部一样的。
阿呆_ 2014-07-28
  • 打赏
  • 举报
回复
srand((unsigned)time(NULL)); ---> 用当前时间初始化rand()的种子, rand只是使用种子的一个数学公式而已,相同种子必然产生相同rand序列。 for (int i = 0; i < 10; ++i) { srand((unsigned)time(NULL)); ---> 你认为最古老的cpu来执行循环体内这几句语句需要超过1秒吗?你每次重设相同的种子,结果当然相同了 double pi2 = (double)rand() / (double)(RAND_MAX); std::cout <<pi2 << std::endl; int n = 11; }
movsd 2014-07-28
  • 打赏
  • 举报
回复
引用 楼主 MagicFuzzX 的回复:
能不能在main函数设置一下,然后在里面调用的子函数里面用rand生成随机数?
本来就应该这样用

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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