srand初始化的随机数种子对rand函数的作用范围是什么?

ooolinux 2016-09-16 12:21:16
srand初始化的随机数种子对rand函数的作用范围是什么?
同一个函数中、同一个文件中、同一个线程中、还是同一个进程中?
为什么?
...全文
649 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2016-09-17
  • 打赏
  • 举报
回复
引用 6 楼 u010165006 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C
/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*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
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*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
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
如果定义了多线程,ptd是线程数据?[/quote] http://blog.csdn.net/ahoo110/article/details/51488303
赵4老师 2016-09-17
  • 打赏
  • 举报
回复
VS IDE中,在不明白的符号上点鼠标右键,选转到定义。
ooolinux 2016-09-17
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C
/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*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
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*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
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
如果定义了多线程,ptd是线程数据?
paschen 2016-09-17
  • 打赏
  • 举报
回复
引用 3 楼 u010165006 的回复:
[quote=引用 1 楼 lm_whales 的回复:] 分为两个不同时代吧 最早是同一进程(全局变量,或者静态变量,储存种子) 如今多半是,同一线程(用的是线程局部存储,储存种子), VC都没有单线程运行时库了 ------------ unix ,linux 应该也类似吧 --------------- C ++11 有新的随机数类,每个随机数对象,初始化一次 当然,这跟C库函数,srand,rand 没有多少关系。
引用 2 楼 paschen 的回复:
范围是同一进程,该函数不保证线程间的安全
随机数种子这个变量定义在哪里呢?[/quote] C标准库
lm_whales 2016-09-16
  • 打赏
  • 举报
回复
分为两个不同时代吧 最早是同一进程(全局变量,或者静态变量,储存种子) 如今多半是,同一线程(用的是线程局部存储,储存种子), VC都没有单线程运行时库了 ------------ unix ,linux 应该也类似吧 --------------- C ++11 有新的随机数类,每个随机数对象,初始化一次 当然,这跟C库函数,srand,rand 没有多少关系。
赵4老师 2016-09-16
  • 打赏
  • 举报
回复
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\RAND.C
/***
*rand.c - random number generator
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines rand(), srand() - random number generator
*
*******************************************************************************/

#include <cruntime.h>
#include <mtdll.h>
#include <stddef.h>
#include <stdlib.h>

#ifndef _MT
static long holdrand = 1L;
#endif  /* _MT */

/***
*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
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}


/***
*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
        )
{
#ifdef _MT

        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );

#else  /* _MT */
        return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
#endif  /* _MT */
}
ooolinux 2016-09-16
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
分为两个不同时代吧 最早是同一进程(全局变量,或者静态变量,储存种子) 如今多半是,同一线程(用的是线程局部存储,储存种子), VC都没有单线程运行时库了 ------------ unix ,linux 应该也类似吧 --------------- C ++11 有新的随机数类,每个随机数对象,初始化一次 当然,这跟C库函数,srand,rand 没有多少关系。
引用 2 楼 paschen 的回复:
范围是同一进程,该函数不保证线程间的安全
随机数种子这个变量定义在哪里呢?
paschen 2016-09-16
  • 打赏
  • 举报
回复
范围是同一进程,该函数不保证线程间的安全

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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