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

ooolinux 2016-09-16 12:21:16
srand初始化的随机数种子对rand函数的作用范围是什么?
同一个函数中、同一个文件中、同一个线程中、还是同一个进程中?
为什么?
...全文
698 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
范围是同一进程,该函数不保证线程间的安全
资源下载链接为: https://pan.quark.cn/s/67c535f75d4c rand() 和 srand() 是 C++ 标准库 中用于生成伪随机数的两个函数rand() 用于生成随机整数,而 srand() 则用于设置随机数生成器的种子值。 rand() 函数 rand() 函数返回一个介于 seed 和 RAND_MAX(值为 0x7fff)之间的随机整数,其中 seed 是通过 srand() 设置的种子值。当 rand() 被调用时,它会检查是否之前调用过 srand(seed)。如果调用过,就使用该种子值初始化随机数生成器;否则,会自动使用 srand(1) 初始化。 srand() 函数 srand() 用于初始化 rand() 的种子值,其参数 seed 决定了随机数生成器的初始状态。虽然可以多次调用 srand(),但只有第一次调用有效,后续调用会被忽略。 生成随机数的方法 要生成随机数,必须先调用 srand() 设置种子值,然后通过 rand() 生成随机数。为了在每次程序运行时生成不同的随机数,需要为 srand() 提供不同的种子值,例如使用当前系统时间作为种子值:srand((unsigned)time(0))。这样,每次程序运行时,随机数生成器的种子值都会不同,从而生成不同的随机数。 生成指定范围的随机整数 要生成指定范围 [a, b) 之间的随机整数,可以使用公式 (rand() % (b - a)) + a。例如,要生成 0 到 6 之间的随机整数,可以使用 rand() % 6。 生成伪随机浮点数 要生成 0 到 1 之间的随机浮点数,可以使用公式 rand() / (double)RAND_MAX。如果需要更大范围的随机浮点数,可以将分母改为 RAND_MAX / 范围。例如,要生成 1 到 10 之间

3,882

社区成员

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

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