C- SRAND与RAND功能有何关系



我知道,如果您不更改种子号,rand()函数每运行都会生成相同的数字。这就是srand()的来源。时间总是在变化,所以我知道您应该将时间(null)参数传递给SRAND。我的问题是在下面的教程网站上使用的代码。

int main()
{
    int i, n=5;
    time_t t;
    /* Intializes random number generator */
    srand((unsigned) time(&t));
    /* Print 5 random numbers from 0 to 50 */
    for( i = 0 ; i < n ; i++ ) {
        printf("%dn", rand() % 50);
    }
    return(0);
}

我看到Srand的链接

((unsigned) time(&t)); 

和兰德。

printf("%dn", rand() % 50);

Rand和Srand之间的连接在哪里?我的意思或期望的是,我假设rand()将从srand()获得一些参数,因此它知道每次都会生成不同的数字。我认为它看起来像rand(srand(time(null));

这就像初始化变量而不将变量使用给我。Srand正在初始化,但我认为它没有使用。

rand会产生不同的数字,因为srand在兰德之前首先被称为?

随机数种子是一个全局静态变量。randsrand都可以访问它。

srand()设置了rand使用的种子来生成"随机"数字(以引号为单位,因为它们通常是伪随机的)。如果您在第一次致电rand之前不致电srand,那就好像您打电话给srand(1)将种子设置为一个一样。

许多代码使用当前时间作为种子,以使每个程序运行使用不同的随机数序列,但是您可以在调试期间将其更改为诸如srand(42)之类的东西,以进行重复性。而对time()的呼叫实际上并不需要需要将时间放入时间,您只需通过null:

srand (time (NULL));

整个内容可以在单个文件中实现,并具有以下内容,标准中给出的示例(ISO C99 7.20.2.2 The srand function)。

// RAND_MAX assumed to be 32767.
static unsigned long int next = 1;
void srand(unsigned int seed) { next = seed; }
int rand(void) {
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

next是文件顶部的静态变量,这意味着文件外的所有内容都不可见,但对内部的所有内容都可以看到(某种局部全局)。这就是srand()rand()之间的通信方法。

您看不到链接,因为(幸运的是!)设计rand()的人决定以相同的方式保留该实现细节,就像您看不到STDIO中的FILE中的内容一样;缺点是他们决定使该状态成为一个全局(但隐藏的)变量,而不是发电机的参数。

对比反对的 rand_r():状态是一个无符号整数(假定为> = 32位),这意味着即使是 forbidden 使用任何状态更大的更好的发生器,仅仅是因为没有存储空间!

通过将内部状态隐藏,相反,只要您保证无初始化的rand nond and nondy nondy nonge and the幕后,就可以自由选择任何算法(速度,期限,...)并在幕后使用它。用种子==1。

调用srand

paxdiablo向您展示了C标准的示例;请参阅eg http://en.wikipedia.org/wiki/multiply-with-carry,以示例使用其他发电机,您可以隐藏在rand/srand后面。

只是要明确:如果正确设计了rand_r,则会有不透明的类型,例如rand_t(可能是整数,结构,一个数组,...),您将传递给rand_r以及某些偏瘫的srand_r,如

rand_t state;
srand_r(&state, 1);
n = rand_r(&state);

rand函数与此完全一样,只是只有一个state变量。

rand 为您提供数字的伪随机序列。

此数字是由每次调用时返回一系列无关数字的序列而生成的。该算法使用种子生成该系列,该系列应使用函数SRAND初始化为某些独特的值。

srand 在每个呼叫上将指针设置为列表中的某些位置。如果您在每次尝试上不调用它或给它一个修复种子,它将为您提供相同的序列。许多人建议将电流作为种子。但是,如果您尝试在同一第二秒内运行代码,它将给您相同的顺序。

对于呼叫SRAND中使用的每个不同种子价值,可以期望伪随机数生成器在随后呼叫的RAND中产生不同的结果,以进一步说明

最新更新